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 - DIY
    • Projekty - DIY roboty
    • Projekty - DIY (mini)
    • Projekty - DIY (początkujący)
    • Projekty - DIY 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


Imię


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.