» »

[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:
//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 :D

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. :))

RatedR ::

Čudo je ta cela koda :))


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Arduino kot časovni rele

Oddelek: Pomoč in nasveti
81037 (623) davor92
»

Pomoč C++

Oddelek: Pomoč in nasveti
7820 (539) samo111
»

Arduino in luči (strani: 1 2 )

Oddelek: Elektrotehnika in elektronika
988458 (6084) FX6300B
»

Arduino "leteče luči"

Oddelek: Elektrotehnika in elektronika
132294 (1171) zrataj4201
»

Arduino - krmiljenje stepper motorjev

Oddelek: Elektrotehnika in elektronika
152824 (2003) steling

Več podobnih tem