Skocz do zawartości

Przeszukaj forum

Pokazywanie wyników dla tagów 'komunikacja pc'.

  • Szukaj wg tagów

    Wpisz tagi, oddzielając przecinkami.
  • Szukaj wg autora

Typ zawartości


Kategorie forum

  • Elektronika i programowanie
    • Elektronika
    • Arduino i ESP
    • Mikrokontrolery
    • Raspberry Pi
    • Inne komputery jednopłytkowe
    • Układy programowalne
    • Programowanie
    • Zasilanie
  • Artykuły, projekty, DIY
    • Artykuły redakcji (blog)
    • Artykuły użytkowników
    • Projekty - roboty
    • Projekty - DIY
    • Projekty - DIY (początkujący)
    • Projekty - w budowie (worklogi)
    • Wiadomości
  • Pozostałe
    • Oprogramowanie CAD
    • Druk 3D
    • Napędy
    • Mechanika
    • Zawody/Konkursy/Wydarzenia
    • Sprzedam/Kupię/Zamienię/Praca
    • Inne
  • Ogólne
    • Ogłoszenia organizacyjne
    • Dyskusje o FORBOT.pl
    • Na luzie

Kategorie

  • Quizy o elektronice
  • Quizy do kursu elektroniki I
  • Quizy do kursu elektroniki II
  • Quizy do kursów Arduino
  • Quizy do kursu STM32L4
  • Quizy do pozostałych kursów

Szukaj wyników w...

Znajdź wyniki, które zawierają...


Data utworzenia

  • Rozpocznij

    Koniec


Ostatnia aktualizacja

  • Rozpocznij

    Koniec


Filtruj po ilości...

Data dołączenia

  • Rozpocznij

    Koniec


Grupa


Strona

Znaleziono 4 wyniki

  1. Dzień dobry Wszystkim! Tak w skrócie, mój robot ma się poruszać po wyznaczonej ścieżce i robić mapę otoczenia wraz z pokazywaniem swojej pozycji. Mam problem z komunikacją, HC-06 mam podłączony do Arduino Mega 2560 przez RX,TX. Wysyłam dane z czujników optycznych odnośnie pozycji (pozycja już wyliczana w Arduino). Przesyłam 2 zmienne po sobie x1, y1. Arduino łączy się w 1-2 sekundy z moim telefonem, na telefonie używam Serial Bluetooth Terminal i odczyty z Arduino sa odbierane bez problemu (wysyłam około 4-6 danych/sekundę). Podczas łączenia się z komputerem trwa to 30sekund, a czasem 1-2minuty. Po stronie PC mam Bluetootha 4.0 Asusa USB-BT400 (pisze że jest kompatybilny z wersjami 2.0, 2.1, 3.0 no i 4.0... jest BLE (Low Energy). Używam do tego skryptu napisanego w Matlabie. Ta część odpowiada za samo połączenie. Działa gdyż w ustawieniach windowsa w sekcji bluetooth widzę HC-06 i mam sparowane i połączone. delete(instrfind) %zamkniecie otwartych portow w Matlabie clear all instrhwinfo('Bluetooth','HC-06') bt = Bluetooth('HC-06', 1) fopen(bt); Kolejna część kodu zajmuje się odczytem przesyłanych danych i prostym rysowaniem. tic; figure(1); x=0; xn=0; y=0; yn=0; while (true) x=fscanf(bt,'%f'); %odczyt impulsow z lewego kola y=fscanf(bt,'%f'); %odczyt impulsow z prawego kola xn=xn+x; yn=yn+y; plot(xn,yn,'black*') axis auto hold on end Dodam że czasem działa, ale głownie mam błąd z przekroczeniem czasu. Co może być przyczyną że jest taki problem z połączeniem? Poniżej screen z 2 kółek... Dzisiaj udało mi się nawiązać tylko 2 razy połączenie, a z telefonem śmiga. Tylko że na telefonie nie mam takich możliwości z odbieraniem danych i rysowaniem ich. A może jest jakaś apka na androida co by mi rysowała położenie mojego robota? Na koniec kod z Arduino. Trzymanie się lini i sterowanie silnikami wykonuje na niezależnym Arduino Nano. Próbowałem wykonywać i śledzenie linii, PID'a i odczyt z enkoderów, a także obsługę 3 czujników HC-SR04 na jednej platformie Arduino MEga2560, ale nie ogarniał (a może to mój nie zoptymalizowany kod?). Robiłem to przerwaniach, wątkach itd. Stanęło na 2 Arduino jak teraz, choć zastanawiam się nad platformą ESP32, nie wiem czy by nie było łatwiej. Proszę o pomoc. //czujniki lini #define L2_LINE_SENSOR A0 #define R2_LINE_SENSOR A1 //czujniki szczelinowe #define L_SZCZ 2 #define P_SZCZ 3 //silniki #define LMOTOR 9 #define RMOTOR 8 #define IN1 4 #define IN2 5 #define IN3 6 #define IN4 7 //czujniki ultradzwiekowe #define SechoHSCR04 51 #define StrigHSCR04 49 #define PechoHSCR04 50 #define PtrigHSCR04 48 #define LechoHSCR04 42 #define LtrigHSCR04 40 #include <Stream.h> #include <SoftwareSerial.h> SoftwareSerial mySerial(17, 16); // RX, TX #include <Wire.h> #include <Timers.h>//watki Timers<1>akcja;//watki volatile float impL=0, impP=0, vx1=0, vy1=0; //"impL","impP"-impulsy z enkoderow; float x1=0, y1=0, r=3.25, teta=0, tetaKat=0, tetaV=0, d=6.5, l=0, L=13.30, dystansL=0, dystansP=0, dystansS=0; //"r"-promien kola; "L"-odleglosc pomiedzy kolami mierzona od osi kola int licznik=0; int blad=0, g=200, vstart=40, pochodna=0, poprzedni=0, calka=0, PID=0; //"g"-granica widzialnosci czarnej lini; "vstart"-predkosc stala float Kp=8, Kd=0.1, Ki=0.4; //nastawy regulatora PID float Ldystans=0, Sdystans=0, Pdystans=0; float doMetra=0, prawo90=0; unsigned long s=0, start=0, time=0, aktualnyCzas=0, zapamietanyCzas=0, roznicaCzasu=0;//timery String inString = ""; void setup() { //Zasilanie +++ pinMode (47, OUTPUT);//ultradzwiekowy srodek digitalWrite(47, HIGH); pinMode (46, OUTPUT);//ultradzwiekowy prawy digitalWrite(46, HIGH); pinMode (38, OUTPUT);//ultradzwiekowy lewy digitalWrite(38, HIGH); pinMode (22, OUTPUT);//szczelinowy prawy digitalWrite(22, HIGH); pinMode (23, OUTPUT);//szczelinowy lewy digitalWrite(23, HIGH); //Masa --- pinMode (53, OUTPUT);//ultradzwiekowy srodek digitalWrite(53, LOW); pinMode (52, OUTPUT);//ultradzwiekowy prawy digitalWrite(52, LOW); pinMode (44, OUTPUT);//ultradzwiekowy lewy digitalWrite(44, LOW); //--------------Czujniki optyczne pinMode(L_SZCZ, INPUT); pinMode(P_SZCZ, INPUT); l=d*PI; //Silniki pinMode (LMOTOR, OUTPUT);//lewy pinMode (IN1, OUTPUT);//przod pinMode (IN2, OUTPUT);//tyl pinMode (RMOTOR, OUTPUT);//prawy pinMode (IN3, OUTPUT);//przod pinMode (IN4, OUTPUT);//tyl analogWrite(LMOTOR, 0); //Ustawienie predkosci digitalWrite(IN1, HIGH); //Kierunek: do przodu digitalWrite(IN2, LOW); //Kierunek: do tylu analogWrite(RMOTOR, 0); //Ustawienie predkosci digitalWrite(IN3, HIGH); //Kierunek: do przodu digitalWrite(IN4, LOW); //Kierunek: do tylu //Czujniki odbiciowe pinMode(R2_LINE_SENSOR, INPUT); pinMode(L2_LINE_SENSOR, INPUT); //Czujniki ultradzwiekowe pinMode(SechoHSCR04, INPUT); pinMode(StrigHSCR04, OUTPUT); pinMode(LechoHSCR04, INPUT); pinMode(LtrigHSCR04, OUTPUT); pinMode(PechoHSCR04, INPUT); pinMode(PtrigHSCR04, OUTPUT); mySerial.begin(9600); Serial.begin(9600); s=millis(); start=millis(); time = millis(); //------------Watki------------ //akcja.attach(0, 50, wysylanie); akcja.attach(0, 250, pozycja); //akcja.attach(1, 980, hcsr04lewy); //akcja.attach(2, 990, hcsr04srodek); //akcja.attach(3, 1000, hcsr04prawy); //akcja.attach(4, 2000, stopMotors); //--------------Przerwania na enkoderach kol--------------------- attachInterrupt(digitalPinToInterrupt(2), enkoderL, LOW); attachInterrupt(digitalPinToInterrupt(3), enkoderP, LOW); } //******************************************** //*****************FUNKCJE******************** //******************************************** //-----------------Wysylanie pozycji z arduinoNano przez BT void wysylanie() { if (Serial.available() > 0) { int inChar = Serial.read(); if (inChar != '\n') { inString += (char)inChar; } else { Serial.println(inString.toFloat()); inString = ""; } } } //----------------Enkodery kol void enkoderL() { if ((millis() - time) > 5) impL++; time = millis(); } void enkoderP() { if ((millis() - time) > 5) impP++; time = millis(); } //----------------Pozycja pojazdu void pozycja() { //droga przejechana przez kazde z kol dystansL=(impL/20)*l; dystansP=(impP/20)*l; //kata o jaki obrocil sie robot tetaKat=tetaKat+((dystansP-dystansL)/L); //pozycja dystansS=(dystansP+dystansL)/2; x1=dystansS*(cos(tetaKat)); y1=dystansS*(sin(tetaKat)); //Serial.print("x1: "); mySerial.println(x1); //Serial.print("y1: "); mySerial.println(y1); //reset licznikow impL=0; impP=0; } //---------------Jazda prosto 1 metr void jedenMetr () { if (doMetra<100) { dystansL=(impL/20)*l; dystansP=(impP/20)*l; dystansS=(dystansP+dystansL)/2; analogWrite(RMOTOR, 70); //Ustawienie predkosci digitalWrite(IN3, HIGH); //Kierunek: do przodu analogWrite(LMOTOR, 70); //Ustawienie predkosci digitalWrite(IN1, HIGH); //Kierunek: do przodu doMetra=dystansS+doMetra; //reset licznikow impL=0; impP=0; Serial.println(doMetra); } else if (doMetra>=100) { analogWrite(RMOTOR, 0); //Ustawienie predkosci digitalWrite(IN3, LOW); //Kierunek: do przodu analogWrite(LMOTOR, 0); //Ustawienie predkosci digitalWrite(IN1, LOW); //Kierunek: do przodu } } //---------------Skręt w prawo 90 stopni void wPrawo90 () { if (prawo90<20.88) { dystansL=(impL/20)*l; analogWrite(RMOTOR, 0); //Ustawienie predkosci digitalWrite(IN3, LOW); //Kierunek: do przodu analogWrite(LMOTOR, 70); //Ustawienie predkosci digitalWrite(IN1, HIGH); //Kierunek: do przodu prawo90=dystansL+prawo90; //reset licznikow impL=0; impP=0; Serial.println(prawo90); } else if (prawo90>=20.88) { analogWrite(LMOTOR, 0); //Ustawienie predkosci analogWrite(RMOTOR, 0); //Ustawienie predkosci digitalWrite(IN1, LOW); digitalWrite(IN3, LOW); } } //---------------Pomiar odleglosci czujnika srodkowego void hcsr04srodek () { float czas; digitalWrite(StrigHSCR04, LOW); delayMicroseconds(2); digitalWrite(StrigHSCR04, HIGH); delayMicroseconds(10); digitalWrite(StrigHSCR04, LOW); czas = pulseIn(SechoHSCR04, HIGH); Sdystans = (czas / 58); //delay(1000); //Serial.print("\nOdleglosc-srodek: "); mySerial.println(Sdystans); } //---------------Pomiar odleglosci czujnika lewego void hcsr04lewy () { float czas; digitalWrite(LtrigHSCR04, LOW); delayMicroseconds(2); digitalWrite(LtrigHSCR04, HIGH); delayMicroseconds(10); digitalWrite(LtrigHSCR04, LOW); czas = pulseIn(LechoHSCR04, HIGH); Ldystans = (czas / 58); //delay(1000); //Serial.print("\nOdleglosc-lewy: "); mySerial.println(Ldystans); } //---------------Pomiar odleglosci czujnika prawego void hcsr04prawy () { float czas; digitalWrite(PtrigHSCR04, LOW); delayMicroseconds(2); digitalWrite(PtrigHSCR04, HIGH); delayMicroseconds(10); digitalWrite(PtrigHSCR04, LOW); czas = pulseIn(PechoHSCR04, HIGH); Pdystans = (czas / 58); //delay(1000); //Serial.print("\nOdleglosc-prawy: "); mySerial.println(Pdystans); } //---------------------Wyliczenie bledu int error () { if (analogRead(L2_LINE_SENSOR) < g && analogRead(R2_LINE_SENSOR) < g) { //nie widza lini blad=1; } else if (analogRead(L2_LINE_SENSOR) > g && analogRead(R2_LINE_SENSOR) < g) { //lewy widzi linie blad=2; } else if (analogRead(L2_LINE_SENSOR) < g && analogRead(R2_LINE_SENSOR) > g) { //prawy widzi linie blad=-2; } //Serial.print("blad: "); //Serial.println(blad); return blad; } //-----------------------------PID void regPID () { pochodna=blad-poprzedni; poprzedni=blad-poprzedni; calka=constrain(calka+blad, -50, 50); PID=round(abs((Kp*blad)+(Kd*pochodna)+(Ki*calka))); //Serial.print("PID: "); //Serial.println(PID); if (blad == 1) {//jazda prosto leftMotor(vstart); rightMotor(vstart); } else if (blad == 2) { //lewy widzi linie leftMotor(vstart-PID); rightMotor(vstart+PID); } else if (blad == -2) { //prawy widzi linie leftMotor(vstart+PID); rightMotor(vstart-PID); } } //-------------------Sterowanie silnikami void leftMotor(int V) { if (V>0) { //V=constrain(V, 0, 256); analogWrite(LMOTOR, V); //Ustawienie predkosci digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW); } else { //stop //V=abs(V); analogWrite(LMOTOR, 0); //Ustawienie predkosci digitalWrite(IN1, LOW); digitalWrite(IN2, LOW); } } void rightMotor(int V) { if (V>0) { //V=constrain(V, 0, 256); analogWrite(RMOTOR, V); //Ustawienie predkosci digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW); } else { //stop //V=abs(V); analogWrite(RMOTOR, 0); //Ustawienie predkosci digitalWrite(IN3, LOW); digitalWrite(IN4, LOW); } } void stopMotors() { analogWrite(LMOTOR, 0); //Ustawienie predkosci analogWrite(RMOTOR, 0); //Ustawienie predkosci digitalWrite(IN1, LOW); digitalWrite(IN2, LOW); digitalWrite(IN3, LOW); digitalWrite(IN4, LOW); delay(1000); } //--------------PETLA GLOWNA-------------- void loop() { //jedenMetr(); //wPrawo90(); //akcja.process(); //aktualnyCzas = millis(); //roznicaCzasu = aktualnyCzas - zapamietanyCzas; //error(); //regPID(); delay(200); pozycja(); //if (roznicaCzasu >= 250UL) { //zapamietanyCzas = aktualnyCzas; //pozycja(); //hcsr04lewy(); //hcsr04srodek(); //hcsr04prawy(); //} /* float czas=millis(); Serial.println(analogRead(R2_LINE_SENSOR)); delay(1000); Serial.print(" , "); Serial.println(czas/1000); */ }
  2. Python to język wysokopoziomowy, który ma bardzo szerokie zastosowanie. Można w nim napisać grę (PyGame) albo zrobić komunikację mikrokontrolera z programem na komputerze/laptopie (PySerial), aby na przykład wysyłać komendy. W tym kursie zajmiemy się tą drugą biblioteką. W starszych komputerach istnieją porty szeregowe RS-232. W nowszych komputerach portu tego raczej się nie uraczy. Ten wpis brał udział konkursie na najlepszy artykuł o elektronice lub programowaniu. Sprawdź wyniki oraz listę wszystkich prac » Partnerem tej edycji konkursu (marzec 2020) był popularny producent obwodów drukowanych, firma PCBWay. Jest jednakże światełko w tym ciemnym tunelu, gdyż sterowniki niektórych urządzeń USB emulują port szeregowy COM umożliwiając tym samym proste komunikowanie się z takim urządzeniem na nowszych maszynach. Do takich urządzeń należą płytki rozwojowe Arduino RS-232(rys. 1) Prosta komunikacja pomiędzy uC (mikrokontrolerem) a PC (rys. 2) 1.Wysyłanie informacji z mikrokontrolera do komputera/laptopa. Konfiguracja połączenia z portem COM Zanim zacznie się przygodę z komunikacją za pośrednictwem portu COM konieczne jest zapoznanie się z podstawami jego działania. Port ten przesyła dane dwukierunkowo za pomocą jednego pinu przesyłającego i jednego odczytującego dane. Dane przesyłane są zawsze z określoną prędkością mierzoną w bitach na sekundę. Standardowe ustawienie prędkości transmisji z urządzeniem wynosi 9600 bitów na sekundę. Ważne aby, wysyłać i odbierać dane z taką samą częstotliwością w przeciwnym przypadku dane nie będą odbierane przez urządzenie w sposób poprawny jak również program nie będzie w stanie poprawnie odbierać danych. Przy podstawowej konfiguracji konieczne jest również posiadanie wiedzy o nazwie portu. Pod Windowsem nazwy portów zaczynają się od COM i kończą liczbą określającą numer portu. Można sprawdzić w systemie, jakie porty COM są dostępne w Menadżerze urządzeń co też i widać na poniższym rysunku (rys. 3) rys. 3 Przygotowanie środowiska na komputerze/laptopie Tak jak już mówiłem, będziemy potrzebować biblioteki PySerial omówię jej instalację w środowisku PyCharm: Wchodzimy w terminal, następnie wpisujemy: "pip install pyserial" Naciskamy enter Powinniśmy zobaczyć coś takiego (rys. 4) rys. 4 teraz przejdzmy do Arduino. Przygotowywanie Arduino (oczywiście zadziała komunikacja zadziała wszędzie gdzie użyjemy UART'a, nie tylko Arduino) Na razie jedyne co napiszemy to: void setup() { Serial.begin(9600); // Ustawienie Baud Rate(prędkość transmisji) na 9600Hz } void loop() { Serial.println("Proba Komunikacji"); delay(1000); } Wgrywamy nasz program, uruchamiamy Monitor Portu Szeregowego gdzie powinno sie pojawić się (rys. 5) rys. 5 i tak co około sekundę (przy okazji widzimy, że funkcja delay nie jest taka dokładna (dlatego nie stosuje sie jej gdy robimy na przykład zegar)) Teraz można przejść do PyCharma import serial arduino = serial.Serial('COM5', 9600, timeout=0.1) while True: data = arduino.readline() if data: data = data.decode() print(data) Można powiedzieć, że właśnie zrobiliśmy monitor portu szeregowego z ArduinoIDE Omówienie kodu: Importujemy bibliotekę, Ustawiamy port do któego mamy podłączone Arduino oraz Baud Rate, Przypisujemy do zmiennej to co aktualnie jest przesyłane, Jeżeli zmienna nie jest pusta to ją dekodujemy i wyświetlamy na ekranie. ZAWSZE MUSIMY PAMIĘTAĆ O ZDEKODOWANIU (tylko na komputerze)!!! Wyłączamy monitor portu szeregowego (ten z ArduinoIDE), kompilujemy program i naszym oczom powinno ukazać się (rys. 6) rys. 6 2. Wysyłanie komend z komputera/laptopa do mikrokontrolera. Przejdźmy do PyCharma import serial import time arduino = serial.Serial('COM5', 9600, timeout=0.01) while True: arduino.write('wlacz'.encode()) time.sleep(1) arduino.write('wylacz'.encode()) time.sleep(1) Importujemy bibliotekę time (nie trzeba jej instalować) oraz wysyłamy "wiadomości": "wlacz" oraz "wylacz" To by było na tyle w PyCharmie, przejdźmy więc do ArduinoIDE rys. 7 Jako że robimy komunikację używając UART'a, który może wysyłać maksymalnie jeden znak, ponieważ (rys. 7) jeden znak to jeden bajt (bajt ma 8bitów) a my wysyłamy komendy: "wlacz" oraz "wylacz" to musimy zrobić taki mały myczek elektryczek i użyć zmiennej oraz pętli. Będzie wyglądać to tak: wysyłamy: w Arduino: "odbiera" i zapisuje do zmiennej wysyłamy: l Arduino: "odbiera" i zapisuje do zmiennej wysyłamy: a Arduino: "odbiera" i zapisuje do zmiennej wysyłamy: c Arduino: "odbiera" i zapisuje do zmiennej wysyłamy: z Arduino: "odbiera" i zapisuje do zmiennej nie wysyłamy nic Arduino: wychodzi z pętli oraz porównuje zawartość zmiennej z komendami które ma zapisane Arduino: wykonuje komendę Arduino: czyści zawartość zmiennej z komendą Takie wybrnięcie z sytuacji int i = 12; //pin do którego podłączymy diodę String komenda=""; void setup() { Serial.begin(9600); pinMode(i, OUTPUT); digitalWrite(i, HIGH); } void loop() { if(Serial.available() > 0) { while(Serial.available() > 0) { komenda += char(Serial.read()); } Serial.println(komenda); if(komenda == "wlacz") { digitalWrite(i, HIGH); } if(komenda == "wylacz") { digitalWrite(i, LOW); } komenda = ""; } delay(100); } Oczywiście można wysłać do komputera/laptopa "informację zwrotną" na przykład: Dioda jest wlaczona Dioda jest wylaczona Tylko musimy pamiętać aby użyć .decode(), ale tak jak mówiłem, tylko w programie na komputrzez/laptopie Jeżeli nasze komendy będą miały tylko 1 znak na przykład: a, A, 1, B, c, C ,4 (ogólnie to dowolny znak z tabeli ASCII) nie trzeba używać pętli tylko: if(Serial.read() == 's') oczywiście też w tym ifie: if(Serial.available() > 0) Jeżeli wstawilibyśmy tam więcej znaków dostalibyśmy taki komuniukat: warning: multi-character character constant [-Wmultichar]. 3. Podsumowanie Wysyłanie oraz odbieranie informacji jest bardzo przydatne, nie musi być to tylko pomiędzy uC, a komputerem. Może to być komunikacja pomiędzy dwoma uC na przykład: karta microSD ma w sobie procesor który komunikuje sie z uC używając SPI, termometr DS18B20 który komunikuje z uC używając protokołu komunikacji OneWire (rys. 8), czujnik podczerwieni, procesor w naszych komputerach z mostkiem, pamięcią i GPU, ładowarka z telefonem, aby ustalić jaki prąd i napięcie. Komunikacja jest wszędzie (można powiedzieć, że urządzenia są bardziej komunikatywne od nas ). rys. 8
  3. Wstęp Na wstępie opiszę krótko projekt: Będzie to prosty układ, projekt głównie opiera się na kodzie w Arduino IDE (zamiana tekstu na alfabet morse'a i zapalanie diody) oraz którkim kodzie w Python do komunikacji arduino z PC. Potrzebne rzeczy: Potrzebne elementy: Arduino Uno/Leonardo, Płytka stykowa, dioda LED, rezystor min. 230 Ohm (u mnie 330 Ohm), 2x przewód męsko-męski Układ jest bardzo prosty do zmontowania Program w Arduino IDE: //zmienne String aM[25] = { //Kod alfabetu: 1-kropka, 2-kreska, 0-koniec (dla kodów o ilości kropek i kresek mniejszej od 4, optymalizacja) //A B C D E "1200", "2111", "2121", "2110", "1000", //F G H I J "1121", "2210", "1111", "1100", "1222", //K L M N O "2120", "1211", "2200", "2100", "2220", //P Q R S T "1221", "2212", "1210", "1110", "2000", //U W X Y Z "1120", "1220", "2112", "2122", "2211" }; char alfabet[25] = { //Alfabet łaciński - index aM[] i alfabet[] jest taki sam dla każdego znaku "abcdefghijklmnopqrstuwxyz" }; char message[100]; //Wiadomość otrzymana z komputera String msgGet; //Zmienna pomocnicza int aM_Delay = 300; //Czas kropki, wg zasad alfabetu morse'a kresta to 3x kropka int ledPin = 13; //Pin diody void setup() { // put your setup code here, to run once: pinMode(ledPin, OUTPUT); //ustawienie pinu diody na OUTPUT } void loop() { delay(2500); //Opóźnienie między komendami, nie jest wymagane for(int x=0; x<100; x++) //Wyczyszczenie całej wiadomości message[x] = '0'; bool waiting = true; //Zmienna pomocnicza while(waiting) { if(Serial.available() > 0) //Jeśli otrzymano wiadomość { msgGet = Serial.readString(); //Odczytanie wiadomości if(msgGet.length() > 100) //jeśli wiadomości jest za długa, zignoruj iteracje pętli - oczekiwanie na kolejną wiadomość continue; for(int i=0; i < msgGet.length(); i++) //Zapisanie wiadomości ze zmiennej string do tablicy char - ułatwia nadanie wiadomości message[i] = msgGet.charAt(i); msgGet = '0'; //Wyczyszczenie otrzymanej wiadomości waiting = false; //Koniec pętli while } } for(int m=0; m < 100; m++) //Pętla dla każdego znaku wiadomości { for(int i=0; i<=25; i++) //Pętla dla każdego znaku alfabetu { if(message[m] == alfabet[i]) //znalezienie indeksu znaku wiadomości w alfabecie { for(int x=0; x < 4; x++) //Znak może mieć max 4 kropki lub kreski { if('2' == aM[i].charAt(x)) //Jeśli 2 (kreska) - zapala diodę na aM_Delay * 3 - aM_Delay to też odstęp między sygnałami { digitalWrite(ledPin, HIGH); delay(aM_Delay * 3); digitalWrite(ledPin, LOW); delay(aM_Delay); } else if('1' == aM[i].charAt(x)) //Jesli 1 (kropka) -;;- { digitalWrite(ledPin, HIGH); delay(aM_Delay); digitalWrite(ledPin, LOW); delay(aM_Delay); } else if('0' == aM[i].charAt(x)) //Jeśli 0 - zakończ pętlę (koniec znaku) { delay(aM_Delay); break; } } } } } } Myślę, że komentarze w kodzie pozwolą wszystkim zrozumieć, o co chodzi Program w Python: import serial #biblioteka do komunikacji port = input("Enter port: ") #zmienna z ustawionym przez użytkownika portem do komunikacji ser = serial.Serial(port, 9600) #zainicjowanie płytki na wybranym porcie myMessage = "" #zmienna do zapisu wiadomości while 1: #pobieranie wiadomości w nieskończoność, dopóki nie wyłaczymy programu myMessage = input("Enter a message: ") #zapisanie wiadomości w zmiennej ser.write(myMessage.encode('UTF-8')) #wysłanie wiadomości przez port, z kodowaniem UTF-8 Aby poprawnie wprowadzić nazwę portu, najłatwiej podłączyć arduino do komputera i w arduino IDE sprawdzić port, u mnie np. jeszt to COM5 (Arduino Leonardo) - wpisujemy więc COM5 A tak wygląda program w Pythonie po odpaleniu, jednak aby nie odpalać go za każdym razem z poziomu CMD, ułatwimy sobie zadanie kolejnym plikiem: run.bat w którym podajemy ścieżkę do pliku python (wraz z rozszerzeniem!) @echo off start G:\ArduinoProjects\MorseCodeNadajnik\MorseCode_Nadajnik.py Plik .bat nie jest wymagany, ale ułatwia odpalanie komunikacji Należy również pamiętać, że każdu port USB w komputerze to inny port w do wpisanie w Pythonie (wielu o tym zapomina) Mam nadzieję, że komuś to pomoże
  4. Witam szanownych użytkowników, Jestem w trakcie tworzenia GUI do mojego projektu Arduino i chciałbym za pomocą tego GUI kontrolować wyjścia oraz zmienne z których korzystam w projekcie. Komunikacja pomiędzy GUI, a Arduino odbywa się za pomocą portu szeregowego. Dane, które byłyby wysyłane do Arduino z GUI w zależności od wciśniętego button'a wyglądały by w następujący sposób: x = 1 lub y = 0 lub z = 50 itd. Poradzilibyście jakim sposobem można sformatować te dane przychodzące? Póki co w moim projekcie korzystam z LCD i przycisków, ale chciałbym się przerzucić na GUI.
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.