Pojazd sterowany gestami
Pojazd sterowany gestami jest popularnym typem projektów wykonywanych przez hobbystów. Koncepcja, która się za tym kryje, jest prosta: orientacja dłoni kontroluje ruch samochodu robota. Żyroskop MPU6050 wykrywa orientację nadgarstka i przesyła go do arduino w postaci cyfrowej. Zakres wartości wynosi od -32768 do +32767 dla każdej osi. Moduł oparty na układzie NRF24L01 odpowiada za bezprzewodową komunikację między arduino w pilocie, a arduino w pojeździe. Moduł posiadająca dwukierunkową komunikację w paśmie 2,4GHz, do tego płytka drukowana ma wbudowaną antenę. Moduł komunikuje się z mikrokontrolerami poprzez SPI. Zasięg takiego modułu w teorii wynosi do 100 metrów. Ponadto możesz kontrolować moc nadajnika, aby zmniejszyć zużycie energii. Silniki sterowane są przez moduł L298N zasilany sześcioma bateriami AA / R6.
Lista Elementów:
- 2x Arduino Nano
- Żyroskop MPU6050
- 2x NRF24L01
- Moduł L298N
- 2x Płytki prototypowe
- Koszyk na baterie
- 6 baterii AA
- 2x Włączniki
- Bateria 9V
- 4 Silnik TT
- np. Pleksa 10cm x 17cm
Transmitter:

Odbiornik:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
#include <SPI.h> #include <nRF24L01.h> #include <RF24.h> #include<Wire.h> RF24 radio(9,10); // CE, CSN const byte address[6] = "00001"; int dupa=0; int joystick[2]; const int MPU_addr=0x68; // I2C address of the MPU-6050 void setup(){ Serial.begin(9600); radio.begin(); radio.openWritingPipe(address); radio.setPALevel(RF24_PA_MAX); radio.stopListening(); Wire.begin(); Wire.beginTransmission(MPU_addr); Wire.write(0x6B); // PWR_MGMT_1 register Wire.write(0); // set to zero (wakes up the MPU-6050) Wire.endTransmission(true); } void loop(){ Wire.beginTransmission(MPU_addr); Wire.write(0x3B); // starting with register 0x3B (ACCEL_XOUT_H) Wire.endTransmission(false); Wire.requestFrom(MPU_addr,14,true); // request a total of 14 registers joystick[0]=Wire.read()<<8|Wire.read(); // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L) joystick[1]=Wire.read()<<8|Wire.read(); // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L) joystick[2]=Wire.read()<<8|Wire.read(); // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L) radio.write( joystick, sizeof(joystick) ); } |

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 |
/* * Arduino Car NRF24L01 * * ForbiddenBit.com */ #include <SPI.h> #include <nRF24L01.h> #include <RF24.h> #define enA 6 #define in1 7 #define in2 5 #define enB 3 #define in3 4 #define in4 2 RF24 radio(9,10); // CE, CSN const byte address[6] = "00001"; char receivedData[32] = ""; int16_t AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ; int joystick[2]; int z0 = 3000; int zstop = 13000; int y0 = 10000; void setup() { pinMode(enA, OUTPUT); pinMode(enB, OUTPUT); pinMode(in1, OUTPUT); pinMode(in2, OUTPUT); pinMode(in3, OUTPUT); pinMode(in4, OUTPUT); Serial.begin(9600); radio.begin(); radio.openReadingPipe(0, address); radio.setPALevel(RF24_PA_MAX); radio.startListening(); digitalWrite(in1, LOW); digitalWrite(in2, LOW); digitalWrite(in3, LOW); digitalWrite(in4, LOW); } void loop() { if (radio.available()) { // If the NRF240L01 module received data radio.read( joystick, sizeof(joystick) ); radio.read(&receivedData, sizeof(receivedData)); AcX = joystick[0]; AcY = joystick[1]; // DELETE //----------------------------- Serial.print("AcX :"); Serial.print(AcX); Serial.print(" "); Serial.print("AcY :"); Serial.print(AcY); delay(300); //----------------------------- if(AcX<-6000){ //Forward Serial.print(" Forward "); digitalWrite(enA, HIGH); digitalWrite(enB, HIGH); digitalWrite(in1, HIGH); digitalWrite(in2, LOW); digitalWrite(in3, HIGH); digitalWrite(in4, LOW); } else if(AcX>6000){ //BACK Serial.print(" BACK "); digitalWrite(enA, HIGH); digitalWrite(enB, HIGH); digitalWrite(in2, HIGH); digitalWrite(in1, LOW); digitalWrite(in4, HIGH); digitalWrite(in3, LOW); } else if(AcY<-6000 ){ ///LEFT Serial.print(" LEFT "); digitalWrite(enA, HIGH); digitalWrite(enB, HIGH); digitalWrite(in1, HIGH); digitalWrite(in2, LOW); digitalWrite(in3, LOW); digitalWrite(in4, HIGH); } else if(AcY>6000){ //RIGHT Serial.print(" RIGHT "); digitalWrite(enA, HIGH); digitalWrite(enB, HIGH); digitalWrite(in1, LOW); digitalWrite(in2, HIGH); digitalWrite(in3, HIGH); digitalWrite(in4, LOW); } else if(AcX<6000 && AcX>-6000 && AcX<6000 && AcX>-6000 ) { //Stop Serial.print(" Stop "); digitalWrite(enA, LOW); digitalWrite(enB, LOW); digitalWrite(in1, LOW); digitalWrite(in2, LOW); digitalWrite(in3, LOW); digitalWrite(in4, LOW); } } } |
Po przesłaniu programów do arduino podłącz odbiornik do komputera i otwórz MONITOR SZEREGOWY. Włącz nadajnik i zobacz, jak widzisz wartości osi X i osi Y. Teraz ustaw wartości dla każdego kierunku jazdy. Wartość STOP: jeśli wartość DO PRZODU wynosi AcX <-6000, a wartość WSTECZ wynosi AcX> 6000. Wartość STOP będzie zawierać się w zakresie między tymi wartościami AcX <6000 && AcX> -6000.

Zrób to samo dla osi Y. Jeśli twój odbiornik jest teraz dobrze skonfigurowany, usuń ten fragment kodu i załaduj program.
// DELETE // —————————– Serial.print („AcX:”); Serial.print (ACX); Serial.print („”); Serial.print („AcY:”); Serial.print (ACY); delay (300); // —————————–