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 | 1741 (1327) | davor92 |
| » | Pomoč C++Oddelek: Pomoč in nasveti | 1513 (1232) | samo111 |
| » | Arduino in luči (strani: 1 2 )Oddelek: Elektrotehnika in elektronika | 13177 (10803) | FX6300B |
| » | Arduino "leteče luči"Oddelek: Elektrotehnika in elektronika | 3232 (2109) | zrataj4201 |
| » | Arduino - krmiljenje stepper motorjevOddelek: Elektrotehnika in elektronika | 3962 (3141) | steling |