Spisu treści:
- Krok 1: O TYM PROJEKCIE
- Krok 2: Wymagany sprzęt
- Krok 3: Obwód i połączenia
- Krok 4: PRACA
- Krok 5: KOD
- Krok 6: PREZENTACJA WIDEO
Wideo: Sterowanie serwo za pomocą MPU6050 między Arduino i ESP8266 z HC-12: 6 kroków
2024 Autor: John Day | [email protected]. Ostatnio zmodyfikowany: 2024-01-30 11:30
W tym projekcie kontrolujemy położenie serwonapędu za pomocą mpu6050 i HC-12 do komunikacji między Arduino UNO i ESP8266 NodeMCU.
Krok 1: O TYM PROJEKCIE
Jest to kolejny projekt IoT oparty na module HC-12 RF. Tutaj dane imu(mpu6050) z arduino służą do sterowania serwomotorem (połączonym z Nodemcu). Tutaj wizualizacja danych jest również wykonywana po stronie arduino, gdzie dane skoku mpu6050 (obrót wokół osi x) są wizualizowane za pomocą szkicu przetwarzania (omówionego później). Zasadniczo ten projekt jest tylko trochę rozgrzewką do zapamiętania różnych aspektów sterowania Imu i Servo za pomocą Arduino i ESP8266 nodemcu.
CEL
Cel tego jest całkiem jasny: Kontrolujemy pozycję silnika serwo za pomocą wartości skoku IMU. A wszystko razem to skok i zsynchronizowana pozycja silnika jest wizualizowana za pomocą funkcji Processing.
Krok 2: Wymagany sprzęt
Moduł NodeMCU ESP8266 12E Wifi
Płytka stykowa bez lutowania
Przewód połączeniowy
MPU6050 przyspieszenie+żyroskop
Moduły RF HC-12 (para)
Silnik serwo SG90
Krok 3: Obwód i połączenia
Połączenia są proste. Możesz zasilać serwo napięciem 3,3 V z Twojego Nodemcu. Możesz także użyć Vin do zasilania serwa, jeśli twój nodemcu ma tak duże napięcie na tym pinie. Ale większość płyt Lolin nie ma 5V na Vin (zależy od producenta).
Te schematy obwodów są wykonane przy użyciu EasyADA.
Krok 4: PRACA
Gdy tylko rozpocznie się szkic arduino, wyśle on kąt nachylenia (który waha się od -45 do 45) do odbiornika hc12 Nodemcu, który zostanie zmapowany z pozycją Servo od 0 do 180 stopni. Tutaj użyliśmy kąta nachylenia od -45 do +45 stopni, abyśmy mogli łatwo zmapować to do pozycji Servo.
Teraz zastanawiasz się, dlaczego możemy po prostu użyć metody mapy w następujący sposób: –
int poz = mapa(val, -45, 45, 0, 180);
Ponieważ ujemny kąt wysyłany przez nadajnik hc12 odbierany jest jako:
1. połowa: (T)0 do 45 => 0 do 45(R)
2. połowa: (T)-45 do -1 => 255 do 210(R)
Więc musisz zmapować to od 0 do 180, ponieważ
if(wartość>=0 && wartość<=45) pos = (wartość*2)+90; w przeciwnym razie poz = (val-210)*2;
Unikam metody mapy z powodu jakiegoś nieistotnego błędu. Możesz spróbować i skomentować, że działa z tobą
if(wartość>=0 && wartość<=45) pos = map(wartość, 0, 45, 90, 180); w przeciwnym razie pos = map(val, 255, 210, 0, 90); // czwartym argumentem może być 2 (możesz sprawdzić)
MPU6050 Obliczanie kąta nachylenia
Używam biblioteki MPU6050_tockn, która opiera się na podawaniu surowych danych z IMU.
int pitchAngle = mpu6050.getAngleX()
To da nam kąt obrotu wokół osi x. Jak widać na rysunku, moje imu jest ustawione pionowo na płytce stykowej, więc nie pomyl z pitch and roll. Właściwie zawsze powinieneś zobaczyć oś wydrukowaną na tablicy zaciskowej.
Dzięki tej bibliotece nie musisz przejmować się wewnętrzną elektroniką odczytu określonych rejestrów do konkretnej operacji. tylko określasz pracę i gotowe!
Btw jeśli chcesz sam obliczyć kąt. Możesz to łatwo zrobić w następujący sposób:
#włączać
const int MPU6050_addr=0x68; int16_t AcX, AcY, AcZ, Temp, żyroskop, żyroskop, żyroskop; void setup(){ Wire.begin(); Wire.beginTransmission(MPU6050_addr); Wire.write(0x6B); Wire.write(0); Wire.endTransmission(prawda); Serial.początek(9600); } void loop(){ Wire.beginTransmission(MPU6050_addr); Wire.write(0x3B); Wire.endTransmission(fałsz); Wire.requestFrom(MPU6050_addr, 14, prawda); AcX=Przewód.odczyt()<<8|Przewód.odczyt(); AcY=Przewód.odczyt()<<8|Przewód.odczyt(); AcZ=Przewód.odczyt()<<8|Przewód.odczyt(); Temp=Przewód.odczyt()<<8|Przewód.odczyt(); GyroX=Przewód.odczyt()<<8|Przewód.odczyt(); ŻyroskopY=Przewód.odczyt()<<8|Przewód.odczyt(); GyroZ=Przewód.odczyt()<<8|Przewód.odczyt();
int xAng = mapa(AcX, minVal, maxVal, -90, 90); int yAng = mapa(AcY, minVal, maxVal, -90, 90); int zAng = mapa(AcZ, minVal, maxVal, -90, 90); x= RAD_TO_DEG * (atan2(-yAng, -zAng)+PI); y= RAD_TO_DEG * (atan2(-xAng, -zAng)+PI); z= RAD_TO_DEG * (atan2(-yAng, -xAng)+PI); Serial.print("AngleX= "); // Skok Serial.println(x); Serial.print("KątY= "); //Rolka Serial.println(y); Serial.print("AngleZ= "); //Odchylenie Serial.println(z); }
Ale nie jest konieczne pisanie tak dużej ilości kodu, aby uzyskać kąt. Powinieneś znać fakty za kulisami, ale korzystanie z biblioteki innych osób jest bardzo skuteczne w wielu projektach. Możesz przeczytać o tym imu i innych podejściach, aby uzyskać więcej przefiltrowanych danych, klikając poniższy link: Explore-mpu6050.
Mój kod arduino na końcu nadawczym ma tylko 30 linii z pomocą biblioteki MPU6050_tockn, więc korzystanie z biblioteki jest dobre, chyba że nie potrzebujesz podstawowych zmian w funkcjonalności IMU. Biblioteka o nazwie I2Cdev autorstwa Jeffa Rowberga jest bardzo pomocna, jeśli potrzebujesz przefiltrowanych danych za pomocą DMP (Digital Motion Processor) IMU.
Integracja z przetwarzaniem
Tutaj Przetwarzanie służy do wizualizacji danych obrotowych dotyczących osi X IMU, obliczonych na podstawie nieprzetworzonych danych pochodzących z MPU6050. Przychodzące surowe dane w SerialEvent otrzymujemy w następujący sposób:
void serialEvent(Serial myPort) {
inString = mójPort.odczytajString(); try { // Parsowanie danych //println(inString); String DataStrings = split(inString, ':'); if (dataStrings.length == 2) { if (dataStrings[0].equals("RAW")) { for (int i = 0; i < dataStrings.length - 1; i++) { raw = float(ciągi danych[i+1]); } } else { println(inString); } } } catch (Wyjątek e) { println("Złapany wyjątek"); } }
Tutaj możesz zobaczyć wizualizację na obrazku załączonym w tym kroku. Dane pozycji otrzymane na końcu nodemcu są również widoczne na monitorze szeregowym, jak pokazano na obrazku.
Krok 5: KOD
Załączyłem repozytorium github. Możesz go sklonować i rozwidlić, aby użyć go w swoich projektach.
mój_kod
Repo zawiera 2 szkic arduino dla nadajnika (arduino + IMU) i odbiornika (Nodemcu + Servo).
I jeden szkic obróbki. Oznacz gwiazdką repozytorium, jeśli to pomoże w Twoim projekcie.
W tej instrukcji, R-odbiornik i T-nadajnik
Krok 6: PREZENTACJA WIDEO
Film dołączę jutro. Obserwuj mnie, aby otrzymywać powiadomienia.
Dziękuję wam wszystkim!
Zalecana:
Sterowanie serwo Arduino: 6 kroków
Arduino Servo Control: Serwosilniki mają trzy przewody: zasilanie, masę i sygnał. Przewód zasilający jest zwykle czerwony i powinien być podłączony do pinu 5 V na płytce Arduino. Przewód uziemiający jest zwykle czarny lub brązowy i powinien być podłączony do bolca uziemiającego w Ardui
Sterowanie jasnością Sterowanie diodami LED w oparciu o PWM za pomocą przycisków, Raspberry Pi i Scratch: 8 kroków (ze zdjęciami)
Kontrola jasności Sterowanie diodami LED w oparciu o PWM za pomocą przycisków, Raspberry Pi i Scratch: Próbowałem znaleźć sposób, aby wyjaśnić moim uczniom, jak działa PWM, więc wyznaczyłem sobie zadanie kontrolowania jasności diody LED za pomocą 2 przycisków - jeden przycisk zwiększający jasność diody LED a drugi ją przyciemniający. Aby zaprogramować
Sterowanie bramą za pomocą Google Assistent za pomocą ESP8266 NodeMCU: 6 kroków
Sterowanie bramą za pomocą Google Assistent za pomocą ESP8266 NodeMCU: To mój pierwszy projekt dotyczący instrukcji, więc proszę o komentarz poniżej, jeśli są możliwe ulepszenia. Pomysł polega na użyciu asystenta Google do wysłania sygnału do tablicy kontrolnej bramy. Więc wysyłając polecenie, pojawi się przekaźnik, który zamknie
Bezprzewodowe sterowanie serwo: 6 kroków
Wireless Servo Control: Ten projekt steruje obrotem serwomechanizmu bezprzewodowo za pomocą potencjometru (pokrętła). Obrót jest ograniczony do 180 stopni
Sterowanie silnikiem serwo RC za pomocą Arduino i dwóch chwilowych przełączników: 4 kroki
Sterowanie serwomotorem RC za pomocą Arduino i dwóch chwilowych przełączników: nazwa mówi wszystko. Sterowanie serwomotorem samochodu RC za pomocą Arduino i niektórych rezystorów, przewodów połączeniowych i dwóch przełączników dotykowych. Zrobiłem to drugiego dnia, kiedy dostałem Arduino, więc jestem z siebie dość dumny