Forum » Programiranje » [C++/C#] Arduino serijska povezava problem
[C++/C#] Arduino serijska povezava problem
stalker ::
Preko aplikacije, spisane v Visual Studiu 2013 (C#) hočem kontrolirati nekaj DC motorjev (H-bridge). Problem je sledeči in izjemno moteč:
Tale arduino koda dela kot mora:
Tukaj vnašam posamezen znak v serijski monitor in zadeva deluje po pričakovanjih.
V Visual Studiu sem napisal program, ki ob pritisku na gumb pošlje nek string Arduinotu in še enkrat, ko ta gumb spustimo. Funkcija je ta:
Številska vrednost se pretvori v string in pošlje. Do tukaj vse v redu. Arduino sprejme string in ga spremeni v posamezne številske vrednosti:
Številke se spremenijo v integer, izpišejo na LCD, LED na pinu 13 se prižge, ko držim gumb pritisnjen in ugasne, ko ga spustim, samo analogWrite ne dela! Tudi če vpišem noter fiksno vrednost namesto spremenljivke, ravno tako ne deluje. Najbolj zanimivo pa je, da na izhodnih pinih dobim točno to, kar rabim (0-5V za hitrost in signal levo/desno). Samo upam, da ni kakšna banalna rešitev, ker potem bom še bolj jezen za izgubljena 2 dneva
Tale arduino koda dela kot mora:
//Code by Reichenstein7 (thejamerson.com) //Keyboard Controls: // // 1 -Motor 1 Left // 2 -Motor 1 Stop // 3 -Motor 1 Right // // 4 -Motor 2 Left // 5 -Motor 2 Stop // 6 -Motor 2 Right // Declare L298N Dual H-Bridge Motor Controller directly since there is not a library to load. // Motor 1 int dir1PinA = 2; int dir2PinA = 3; int speedPinA = 9; // Needs to be a PWM pin to be able to control motor speed // Motor 2 int dir1PinB = 4; int dir2PinB = 5; int speedPinB = 10; // Needs to be a PWM pin to be able to control motor speed int i=0; void setup() { // Setup runs once per reset // initialize serial communication @ 9600 baud: Serial.begin(9600); //Define L298N Dual H-Bridge Motor Controller Pins pinMode(dir1PinA,OUTPUT); pinMode(dir2PinA,OUTPUT); pinMode(speedPinA,OUTPUT); pinMode(dir1PinB,OUTPUT); pinMode(dir2PinB,OUTPUT); pinMode(speedPinB,OUTPUT); } void loop() { // Initialize the Serial interface: if (Serial.available() > 0) { int inByte = Serial.read(); int speed; // Local variable switch (inByte) { //______________Motor 1______________ case '1': // Motor 1 Forward analogWrite(speedPinA, 255);//Sets speed variable via PWM digitalWrite(dir1PinA, LOW); digitalWrite(dir2PinA, HIGH); Serial.println("Motor 1 Forward"); // Prints out “Motor 1 Forward” on the serial monitor Serial.println(" "); // Creates a blank line printed on the serial monitor break; case '2': // Motor 1 Stop (Freespin) analogWrite(speedPinA, 0); digitalWrite(dir1PinA, LOW); digitalWrite(dir2PinA, HIGH); Serial.println("Motor 1 Stop"); Serial.println(" "); break; case '3': // Motor 1 Reverse analogWrite(speedPinA, 255); digitalWrite(dir1PinA, HIGH); digitalWrite(dir2PinA, LOW); Serial.println("Motor 1 Reverse"); Serial.println(" "); break; //______________Motor 2______________ case '4': // Motor 2 Forward analogWrite(speedPinB, 255); digitalWrite(dir1PinB, LOW); digitalWrite(dir2PinB, HIGH); Serial.println("Motor 2 Forward"); Serial.println(" "); break; case '5': // Motor 1 Stop (Freespin) analogWrite(speedPinB, 0); digitalWrite(dir1PinB, LOW); digitalWrite(dir2PinB, HIGH); Serial.println("Motor 2 Stop"); Serial.println(" "); break; case '6': // Motor 2 Reverse analogWrite(speedPinB, 255); digitalWrite(dir1PinB, HIGH); digitalWrite(dir2PinB, LOW); Serial.println("Motor 2 Reverse"); Serial.println(" "); break; default: // turn all the connections off if an unmapped key is pressed: for (int thisPin = 2; thisPin < 11; thisPin++) { digitalWrite(thisPin, LOW); } } } }
Tukaj vnašam posamezen znak v serijski monitor in zadeva deluje po pričakovanjih.
V Visual Studiu sem napisal program, ki ob pritisku na gumb pošlje nek string Arduinotu in še enkrat, ko ta gumb spustimo. Funkcija je ta:
private void serial_port_send () { //preverimo, če je COM port odprt in povezan, drugače ne pošljemo podatkov, ker pride do napake if (je_com_port_odprt==true) { //pošljemo string z ločenimi podatki za kot posameznega motorja serialPort.Write(vrednost_motor_1 + "," + vrednost_motor_2 + "," + vrednost_motor_3 + "," + vrednost_motor_4 + "," + vrednost_motor_5 + "," + vrednost_motor_6 + "n"); System.Threading.Thread.Sleep(20); } }
Številska vrednost se pretvori v string in pošlje. Do tukaj vse v redu. Arduino sprejme string in ga spremeni v posamezne številske vrednosti:
// include the library code: #include <LiquidCrystal.h> // initialize the library with the numbers of the interface pins LiquidCrystal lcd(7, 8, 9, 10, 11, 12); int dir1PinA = 2; int dir2PinA = 3; int speedPinA = 5; int i = 0; int motor_kot1, motor_kot2, motor_kot3, motor_kot4, motor_kot5, motor_kot6; int index1, index2, index3, index4, index5, index6; String zacasne_vrednosti; String vrednost1, vrednost2, vrednost3, vrednost4, vrednost5, vrednost6; //spremenljivki za branje podatkov iz serijskega vodila String podatki = ""; char crka; String primerjava_s_prejsnjimi_podatki = ""; void setup() { // set up the LCD's number of columns and rows: lcd.begin(16, 2); Serial.begin(115200); // Print a message to the LCD. lcd.print("Hello, world!"); pinMode(dir1PinA, OUTPUT); pinMode(dir2PinA, OUTPUT); pinMode(speedPinA, OUTPUT); pinMode(13, OUTPUT); } void loop() { //dokler so podatki na serijskem vmesniku jih beri if (Serial.available() > 0) { //preberemo string podatki = Serial.readStringUntil('n'); //preberemo indekse posameznih ločil index1 = podatki.indexOf(','); index2 = podatki.indexOf(',', index1 + 1); index3 = podatki.indexOf(',', index2 + 1); index4 = podatki.indexOf(',', index3 + 1); index5 = podatki.indexOf(',', index4 + 1); index6 = podatki.indexOf('\n', index5 + 1); //shranimo posamezne vrednsoti med ločili kot string vrednost1 = podatki.substring(0, index1); vrednost2 = podatki.substring(index1 + 1, index2); vrednost3 = podatki.substring(index2 + 1, index3); vrednost4 = podatki.substring(index3 + 1, index4); vrednost5 = podatki.substring(index4 + 1, index5); vrednost6 = podatki.substring(index5 + 1, index6); //vrednosti v stringih pretvorimo v Int motor_kot1 = vrednost1.toInt(); motor_kot2 = vrednost2.toInt(); motor_kot3 = vrednost3.toInt(); motor_kot4 = vrednost4.toInt(); motor_kot5 = vrednost5.toInt(); motor_kot6 = vrednost6.toInt(); switch (motor_kot2) { case 0: digitalWrite(speedPinA, motor_kot1); analogWrite(dir1PinA, LOW); analogWrite(dir2PinA, HIGH); digitalWrite(13, HIGH); break; case 1: analogWrite(speedPinA, 255); analogWrite(dir1PinA, HIGH); analogWrite(dir2PinA, LOW); digitalWrite(13, HIGH); break; case 2: analogWrite(speedPinA, 0); digitalWrite(13, LOW); break; default: for (int thisPin = 2; thisPin < 11; thisPin++) { digitalWrite(thisPin, LOW); } } lcd.setCursor(0, 0); lcd.print(" "); lcd.setCursor(0, 1); lcd.print(" "); lcd.setCursor(0, 0); lcd.print(motor_kot1); lcd.setCursor(5, 0); lcd.print(motor_kot2); lcd.setCursor(10, 0); lcd.print(motor_kot3); lcd.setCursor(0, 1); lcd.print(motor_kot4); lcd.setCursor(5, 1); lcd.print(motor_kot5); lcd.setCursor(10, 1); lcd.print(i); }
Številke se spremenijo v integer, izpišejo na LCD, LED na pinu 13 se prižge, ko držim gumb pritisnjen in ugasne, ko ga spustim, samo analogWrite ne dela! Tudi če vpišem noter fiksno vrednost namesto spremenljivke, ravno tako ne deluje. Najbolj zanimivo pa je, da na izhodnih pinih dobim točno to, kar rabim (0-5V za hitrost in signal levo/desno). Samo upam, da ni kakšna banalna rešitev, ker potem bom še bolj jezen za izgubljena 2 dneva
stalker ::
Tega ne razumem, ista koda sedaj deluje. Vse, kar sem naredil drugega je to, da sem izbrisal vse podatke o LCD-ju, naložil na Arduinota, ni delalo, dodal nazaj LCD funkcijo in sedaj dela! Čudna so pota programiranja.
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | Arduino kot časovni releOddelek: Pomoč in nasveti | 1630 (1216) | davor92 |
» | Pomoč C++Oddelek: Pomoč in nasveti | 1381 (1100) | samo111 |
» | Arduino in luči (strani: 1 2 )Oddelek: Elektrotehnika in elektronika | 12288 (9914) | FX6300B |
» | Arduino "leteče luči"Oddelek: Elektrotehnika in elektronika | 3020 (1897) | zrataj4201 |
» | Arduino - krmiljenje stepper motorjevOddelek: Elektrotehnika in elektronika | 3773 (2952) | steling |