C# - Arduino soros komunikáció
C# - Arduino soros komunikáció
Sziasztok!
Nem túl régen kezdtem foglalkozni az arduino-val (14. lecke Soros komunikáció)
Visual Studioval készítettem egy egyszerű soros porton komunikáló programot.
A dolog lényege , hogy egy csúszkát figyel, melynek aktuális értékét a soros portra írja.
Működik bármilyen soros eszközzel. Még a telefonom bluetooth soros termináljára is pontosan megérkeznek az adatok.
A sikeren felbuzdulva megpróbáltam az arduino- val is összehozni a dolgot.
Nevezetesen egy led pwm vezérlése volt a kitűzött cél .
Arduino kód :
int led = 5; // Led pin
byte pwm; // pwm értéke , amit soros portról szeretnék beolvasni
void setup(){
Serial.begin(9600);// serial megnyitása 9600 baud
pinMode(led, OUTPUT); led kimenetként beállítva
}
void loop() {
if (Serial.available()>0){ //Ha van soros adat
pwm = Serial.read(); // beolvasom pwm -be
analogWrite(led, pwm); // led bekapcsolása pwm értékével
Serial.println(pwm); // adat visszaírása a soros portra ellenőrzés céljából
}
}
Sajnos a dolog nem működik. A fogadott adatok köszönő viszonyban sincsenek az elküldött adatokkal.
A C# kódrészlet:
private void tBar_ValueChanged(object sender, EventArgs e)
{
string uj = (tBar.Value + ""); //string típusú változó új = (csúszka aktuális értéke + üres karakter)
serialPort1.Write(uj); // Kiírás serial-ra
}
Próbáltam a változót stringből bármi egyéb típusra átalakítani , de az Arduino Ide hibaüzenettel áll meg .
Ráment a dologra egy fél napom . Google is próbált segíteni , de nem sok sikerrel .
Találkozott már valaki hasonló problémával ?
Megvalósítható valahogy a soros porton történő pwm vezérlés?
Előre is köszönöm a válaszokat !
Nem túl régen kezdtem foglalkozni az arduino-val (14. lecke Soros komunikáció)
Visual Studioval készítettem egy egyszerű soros porton komunikáló programot.
A dolog lényege , hogy egy csúszkát figyel, melynek aktuális értékét a soros portra írja.
Működik bármilyen soros eszközzel. Még a telefonom bluetooth soros termináljára is pontosan megérkeznek az adatok.
A sikeren felbuzdulva megpróbáltam az arduino- val is összehozni a dolgot.
Nevezetesen egy led pwm vezérlése volt a kitűzött cél .
Arduino kód :
int led = 5; // Led pin
byte pwm; // pwm értéke , amit soros portról szeretnék beolvasni
void setup(){
Serial.begin(9600);// serial megnyitása 9600 baud
pinMode(led, OUTPUT); led kimenetként beállítva
}
void loop() {
if (Serial.available()>0){ //Ha van soros adat
pwm = Serial.read(); // beolvasom pwm -be
analogWrite(led, pwm); // led bekapcsolása pwm értékével
Serial.println(pwm); // adat visszaírása a soros portra ellenőrzés céljából
}
}
Sajnos a dolog nem működik. A fogadott adatok köszönő viszonyban sincsenek az elküldött adatokkal.
A C# kódrészlet:
private void tBar_ValueChanged(object sender, EventArgs e)
{
string uj = (tBar.Value + ""); //string típusú változó új = (csúszka aktuális értéke + üres karakter)
serialPort1.Write(uj); // Kiírás serial-ra
}
Próbáltam a változót stringből bármi egyéb típusra átalakítani , de az Arduino Ide hibaüzenettel áll meg .
Ráment a dologra egy fél napom . Google is próbált segíteni , de nem sok sikerrel .
Találkozott már valaki hasonló problémával ?
Megvalósítható valahogy a soros porton történő pwm vezérlés?
Előre is köszönöm a válaszokat !
Re: C# - Arduino soros komunikáció
PC oldalon karakterláncként küldöd ki az értéket. Azaz, ami kimegy:
114{010}{013}
Arduino oldalon pedig az "1"-et olvasod be. Az "1" viszont értékben (byte) az ASCII/Byte miatt más értékű!
114{010}{013}
Arduino oldalon pedig az "1"-et olvasod be. Az "1" viszont értékben (byte) az ASCII/Byte miatt más értékű!
Re: C# - Arduino soros komunikáció
Igen!
Sajnos rosszul fogalmaztam az előző h.sz-ban. Szóval C#-ben nem tudok , csak karakterlánc formátumban küldeni.
Közben megoldottam , nem túl elegánsan a dolgot. A különböző pwm értékekhez karaktereket rendeltem . a=10 , b=20 , c= 30..... stb .... Így tökéletesen működik. 25 osztásban tudom vezérelni a pwm-et.
Google-val is próbáltam keresni más megoldást , de semmi használható.
Lenne lehetőség arra, hogy mindenféle átalakítás nélkül elküldjem az adatokat az arduino felé?
Esetleg az Arduino-ban átalakítani , átkonvertálni az adatokat ?
Sajnos rosszul fogalmaztam az előző h.sz-ban. Szóval C#-ben nem tudok , csak karakterlánc formátumban küldeni.
Közben megoldottam , nem túl elegánsan a dolgot. A különböző pwm értékekhez karaktereket rendeltem . a=10 , b=20 , c= 30..... stb .... Így tökéletesen működik. 25 osztásban tudom vezérelni a pwm-et.
Google-val is próbáltam keresni más megoldást , de semmi használható.
Lenne lehetőség arra, hogy mindenféle átalakítás nélkül elküldjem az adatokat az arduino felé?
Esetleg az Arduino-ban átalakítani , átkonvertálni az adatokat ?
Re: C# - Arduino soros komunikáció
Szerintem ez kell neked Arduino oldalon. Igaz ebben 3 PWM van egymás után:
http://arduino.cc/en/Tutorial/ReadASCIIString
Kód: Egész kijelölése
/*
Reading a serial ASCII-encoded string.
This sketch demonstrates the Serial parseInt() function.
It looks for an ASCII string of comma-separated values.
It parses them into ints, and uses those to fade an RGB LED.
Circuit: Common-anode RGB LED wired like so:
* Red cathode: digital pin 3
* Green cathode: digital pin 5
* blue cathode: digital pin 6
* anode: +5V
created 13 Apr 2012
by Tom Igoe
This example code is in the public domain.
*/
// pins for the LEDs:
const int redPin = 3;
const int greenPin = 5;
const int bluePin = 6;
void setup() {
// initialize serial:
Serial.begin(9600);
// make the pins outputs:
pinMode(redPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT);
}
void loop() {
// if there's any serial available, read it:
while (Serial.available() > 0) {
// look for the next valid integer in the incoming serial stream:
int red = Serial.parseInt();
// do it again:
int green = Serial.parseInt();
// do it again:
int blue = Serial.parseInt();
// look for the newline. That's the end of your
// sentence:
if (Serial.read() == '\n') {
// constrain the values to 0 - 255 and invert
// if you're using a common-cathode LED, just use "constrain(color, 0, 255);"
red = 255 - constrain(red, 0, 255);
green = 255 - constrain(green, 0, 255);
blue = 255 - constrain(blue, 0, 255);
// fade the red, green, and blue legs of the LED:
analogWrite(redPin, red);
analogWrite(greenPin, green);
analogWrite(bluePin, blue);
// print the three numbers in one string as hexadecimal:
Serial.print(red, HEX);
Serial.print(green, HEX);
Serial.println(blue, HEX);
}
}
}
Re: C# - Arduino soros komunikáció
Nos, erről nem a C# tehet (link).Wulfgar írta:Sajnos rosszul fogalmaztam az előző h.sz-ban. Szóval C#-ben nem tudok , csak karakterlánc formátumban küldeni.
A C# legnagyobb hibája az, hogy a Microsoft jogász sleppje tönkretette az egészet. Kizárólag MS gépeken, telefonokon működik, szemben a java-val, amelyik minden platformon megy. Éppen ezért nem volt képes a C# leszorítani a java-t.
A nyelv maga fantasztikus mérnöki munka, mindent meg lehetne vele oldani, ha a Microsoft nem saját hatalmi terjeszkedésére használta volna, hanem programozásra, most a legtöbbet használt nyelv lenne.
Re: C# - Arduino soros komunikáció
Sziasztok!
Addig erőlködtem a kérdéssel, hogy egészen messzire sikerült jutni.
Eddig itt tartok: Egy tankmodell vezérlése lesz. 2 db motor 1 db Arduino Uno .
Ha megtenné , hogy ránéz valaki hozzáértő!
Ledeket kötöttem a motor pinekre.
Karakteres formában küldöm el az Arduino felé az információkat.
Nevezetesen : Haladási irány, jobb motor sebesség, bal motor sebesség.
A gázkart (függőleges csúszka) 0 állásba állítva a kormány ( vízszintes csúszka) mozgatásának hatására a két motor ellenkező irányba fog forogni. (Helyben fordul a jármű)
Természetesen abba az irányba , amerre a csúszka ki van térítve.
A C# része nem is érdekes annyira, viszont érdekelne a véleményetek az Arduino-ba írt kódrol.
Előre is köszönet érte , ha valaki ránéz!
Innen letölthető:
https://www.dropbox.com/sh/9v1q8g6ur8vp ... HG3sa?dl=0
Addig erőlködtem a kérdéssel, hogy egészen messzire sikerült jutni.
Eddig itt tartok: Egy tankmodell vezérlése lesz. 2 db motor 1 db Arduino Uno .
Ha megtenné , hogy ránéz valaki hozzáértő!
Ledeket kötöttem a motor pinekre.
Karakteres formában küldöm el az Arduino felé az információkat.
Nevezetesen : Haladási irány, jobb motor sebesség, bal motor sebesség.
A gázkart (függőleges csúszka) 0 állásba állítva a kormány ( vízszintes csúszka) mozgatásának hatására a két motor ellenkező irányba fog forogni. (Helyben fordul a jármű)
Természetesen abba az irányba , amerre a csúszka ki van térítve.
A C# része nem is érdekes annyira, viszont érdekelne a véleményetek az Arduino-ba írt kódrol.
Előre is köszönet érte , ha valaki ránéz!
Innen letölthető:
https://www.dropbox.com/sh/9v1q8g6ur8vp ... HG3sa?dl=0
Re: C# - Arduino soros komunikáció
Szia, a DC motorvezérlés!! Az lesz jó neked....
a terminalba írsz számot... (akármennyit...0-255 ) lineárisan változik... (gondolom már rájöttél, de másnak hátha segít..
int motorPin = 13; //motor kimenet 3-as láb
void setup()
{
pinMode(motorPin, OUTPUT);// 3-as láb kimenet
Serial.begin(57600);
Serial1.begin(57600);//soros monitor bitsebeségének megadása
while (! Serial);
Serial1.println("Speed 0 to 255"); //kiíratás a soros monitorra
}
void loop()
{
if (Serial1.available())
{
int speed = Serial1.parseInt(); //a speed változóba tárolja a soros monitorba beírt értéket
if (speed >= 0 && speed <= 255)// ha az érték megfelel (0-255) akkor
{
analogWrite(motorPin, speed); //ezt az értéket kirakja pwm -re
}
}
}
a terminalba írsz számot... (akármennyit...0-255 ) lineárisan változik... (gondolom már rájöttél, de másnak hátha segít..
int motorPin = 13; //motor kimenet 3-as láb
void setup()
{
pinMode(motorPin, OUTPUT);// 3-as láb kimenet
Serial.begin(57600);
Serial1.begin(57600);//soros monitor bitsebeségének megadása
while (! Serial);
Serial1.println("Speed 0 to 255"); //kiíratás a soros monitorra
}
void loop()
{
if (Serial1.available())
{
int speed = Serial1.parseInt(); //a speed változóba tárolja a soros monitorba beírt értéket
if (speed >= 0 && speed <= 255)// ha az érték megfelel (0-255) akkor
{
analogWrite(motorPin, speed); //ezt az értéket kirakja pwm -re
}
}
}
Re: C# - Arduino soros komunikáció
Igen, azt gondololná az ember, hogy motorvezérlés: sima ügy. Kiadod a PWM jelet egy H hídon, azt előre mész, vagy hátra, függően attól, hogy melyik vonalon milyen feszültség van.
Miután szétszívod az agyad, rájössz, hogy a DC motor és a H bridge az minden csak nem sima ügy.
- a DC motor által keltett nagyfrekis tüskék RESET-elik, vagy fagyasztják az AVR-t: optikai leválasztás kell
- rövidzár a H bridge-en irányváltásnál (a H bridge-en mindkét tranzisztor nem vezethet egyszerre). Na most szoftverből ha irányváltás címszó alatt bináris 01 után azonnal 10-t adsz ki, meglehetősen nagy valószínűséggel rövidzárat csinálsz. A jelnek terjedési ideje van, hiába nyomod a FET gate-jét 16 MHz-en az sokkal lassabban reagál mindenre. Az egyik tranzisztort félig bezárod, a másikat félig kinyitod és már meg is van a rövidzár. Ezt ugye általában meg szokták szívni a mikrovezérlő programozók. Jobb esetben csak egy ejnye-bejnyével, rosszabb esetben füsttel.
Terepasztallal szórakozok, megy is a vonat előre, meg hátra, de tartogatnak pár meglepetést és nagyságrendekkel több dologra kell odafigyelned, mint pl. egy LED-nél.
És akkor még nem jutottunk el a nemlineáris viselkedésig, mert ugye 40%-os PWM nem 40%-os forgási sebességet jelent, meg a többiek.
Nyugodtan lehet játszani DC motorokkal, de az első kudarc után még nem kell elkeseredni. Ilyenek.
Miután szétszívod az agyad, rájössz, hogy a DC motor és a H bridge az minden csak nem sima ügy.
- a DC motor által keltett nagyfrekis tüskék RESET-elik, vagy fagyasztják az AVR-t: optikai leválasztás kell
- rövidzár a H bridge-en irányváltásnál (a H bridge-en mindkét tranzisztor nem vezethet egyszerre). Na most szoftverből ha irányváltás címszó alatt bináris 01 után azonnal 10-t adsz ki, meglehetősen nagy valószínűséggel rövidzárat csinálsz. A jelnek terjedési ideje van, hiába nyomod a FET gate-jét 16 MHz-en az sokkal lassabban reagál mindenre. Az egyik tranzisztort félig bezárod, a másikat félig kinyitod és már meg is van a rövidzár. Ezt ugye általában meg szokták szívni a mikrovezérlő programozók. Jobb esetben csak egy ejnye-bejnyével, rosszabb esetben füsttel.
Terepasztallal szórakozok, megy is a vonat előre, meg hátra, de tartogatnak pár meglepetést és nagyságrendekkel több dologra kell odafigyelned, mint pl. egy LED-nél.
És akkor még nem jutottunk el a nemlineáris viselkedésig, mert ugye 40%-os PWM nem 40%-os forgási sebességet jelent, meg a többiek.
Nyugodtan lehet játszani DC motorokkal, de az első kudarc után még nem kell elkeseredni. Ilyenek.
Re: C# - Arduino soros komunikáció
A ledekkel nekem ez működik 10 fokozatban:
A soros porton a pc -ből jön : 12 akkor bekapcsol az egyes led 2 fényerővel... ha 21 jön, akkor a kettes led 1 -es fényerővel...
Ennél csak 9 fokozat van a lenti "map" miatt... gyakorlatilag átskáláztam a betűk értékeit... ez is egy megoldás...
int zold = 13;
int pir = 11;
byte pwx = 0;
int pwm = 0;
byte colour = 0;
void setup()
{
pinMode(zold, OUTPUT);
pinMode(pir, OUTPUT);
Serial.begin(57600);
Serial1.begin(57600);
while (! Serial);
}
void loop() {
Serial1.flush();
while (Serial1.available()) {
char colour = Serial1.read();
delay(2);
byte pwm = Serial1.read();
pwx = map(pwm, 48, 57, 0, 255);
if (colour == '1') analogWrite(zold, pwx);
if (colour == '2') analogWrite(pir, pwx);
if (colour == 'k') analogWrite(zold, 0),analogWrite(pir, 0), Serial1.println("kikapcs");
else if (colour >= '3') Serial1.println("nincs ilyen led*");
else if (pwm >= '9')Serial1.println("tul nagy power*");
else{
Serial.print("LED ");
Serial.print(colour);
Serial.print(" Power ");
Serial.print(pwx);
Serial.println("%");
}
}
}
Az elegánsabb az lenne .. nem adom fel.. ) Ha ezeket az "irány - gyorsaság - led" stb adatokat vesszővel, Tabbal elválasztva, streamként tudnám kezelni... be shiftelni egy tömbbe, és onnan szépen elemenként (ha kell akármelyik eleme) kiolvasni, konvertálni...
mert azzal már azt csinálsz amit akarsz... de én még csak 3 napja kezdtem.. Majd később lesz elegáns Egy a baja, hogy ez a plenel.... valamiért kikapcsol.. nincs ezen wachdog izé valami.???
A soros porton a pc -ből jön : 12 akkor bekapcsol az egyes led 2 fényerővel... ha 21 jön, akkor a kettes led 1 -es fényerővel...
Ennél csak 9 fokozat van a lenti "map" miatt... gyakorlatilag átskáláztam a betűk értékeit... ez is egy megoldás...
int zold = 13;
int pir = 11;
byte pwx = 0;
int pwm = 0;
byte colour = 0;
void setup()
{
pinMode(zold, OUTPUT);
pinMode(pir, OUTPUT);
Serial.begin(57600);
Serial1.begin(57600);
while (! Serial);
}
void loop() {
Serial1.flush();
while (Serial1.available()) {
char colour = Serial1.read();
delay(2);
byte pwm = Serial1.read();
pwx = map(pwm, 48, 57, 0, 255);
if (colour == '1') analogWrite(zold, pwx);
if (colour == '2') analogWrite(pir, pwx);
if (colour == 'k') analogWrite(zold, 0),analogWrite(pir, 0), Serial1.println("kikapcs");
else if (colour >= '3') Serial1.println("nincs ilyen led*");
else if (pwm >= '9')Serial1.println("tul nagy power*");
else{
Serial.print("LED ");
Serial.print(colour);
Serial.print(" Power ");
Serial.print(pwx);
Serial.println("%");
}
}
}
Az elegánsabb az lenne .. nem adom fel.. ) Ha ezeket az "irány - gyorsaság - led" stb adatokat vesszővel, Tabbal elválasztva, streamként tudnám kezelni... be shiftelni egy tömbbe, és onnan szépen elemenként (ha kell akármelyik eleme) kiolvasni, konvertálni...
mert azzal már azt csinálsz amit akarsz... de én még csak 3 napja kezdtem.. Majd később lesz elegáns Egy a baja, hogy ez a plenel.... valamiért kikapcsol.. nincs ezen wachdog izé valami.???
Re: C# - Arduino soros komunikáció
Az hogy a panel kikapcsol, ott valami más gebasz van.
De, van watchdog. WDT néven fut. Van rá eljáráskönyvtár is...
De, van watchdog. WDT néven fut. Van rá eljáráskönyvtár is...
Re: C# - Arduino soros komunikáció
Ez már vesszővel elválasztott 0,0 tól 255,255 ig hajtja pwm-el a 2db kimenetet:
(leonardo!) a serial1 - az a digital 0;1 port
int led = 13;
int led2 = 11;
void setup()
{
pinMode(led, OUTPUT);
pinMode(led2, OUTPUT);
Serial.begin(57600);
Serial1.begin(57600);
while (! Serial);
}
void loop()
{
if (Serial1.available())
{
Serial1.println("Please: 0,0 to 255,255 ");
int light = Serial1.parseInt();
int light2 = Serial1.parseInt();
Serial.write(light);
Serial.write(light2);
if (light >= 0 && light <= 255)// ha az érték megfelel (0-255) akkor
if (light2 >= 0 && light2 <= 255)
{
analogWrite(led, light);
analogWrite(led2, light2); //ezt az értéket kirakja a led re... pwm
Serial.println(""); //kontroll... hogy lásssssam
Serial.print("LED1: ");
Serial.print(light);
Serial.print(" LED2: ");
Serial.print(light2);
}
}
}
(leonardo!) a serial1 - az a digital 0;1 port
int led = 13;
int led2 = 11;
void setup()
{
pinMode(led, OUTPUT);
pinMode(led2, OUTPUT);
Serial.begin(57600);
Serial1.begin(57600);
while (! Serial);
}
void loop()
{
if (Serial1.available())
{
Serial1.println("Please: 0,0 to 255,255 ");
int light = Serial1.parseInt();
int light2 = Serial1.parseInt();
Serial.write(light);
Serial.write(light2);
if (light >= 0 && light <= 255)// ha az érték megfelel (0-255) akkor
if (light2 >= 0 && light2 <= 255)
{
analogWrite(led, light);
analogWrite(led2, light2); //ezt az értéket kirakja a led re... pwm
Serial.println(""); //kontroll... hogy lásssssam
Serial.print("LED1: ");
Serial.print(light);
Serial.print(" LED2: ");
Serial.print(light2);
}
}
}
Re: C# - Arduino soros komunikáció
@robert : a watchdog.... az egy bootloader bug lehet...
Azt csinálja, ha kikapcsolom, megint fel kell töltenem a programot.. táp elvétele után nem indul a feltöltött progi... ujra kell tölteni.. aztán jó ...ezt mivel lehet orvosolni?
Azt csinálja, ha kikapcsolom, megint fel kell töltenem a programot.. táp elvétele után nem indul a feltöltött progi... ujra kell tölteni.. aztán jó ...ezt mivel lehet orvosolni?