C# - Arduino soros komunikáció

Válasz küldése
Wulfgar
Újonc
Újonc
Hozzászólások: 7
Csatlakozott: 2014. szeptember 1. hétfő, 13:17

C# - Arduino soros komunikáció

Hozzászólás Szerző: Wulfgar »

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 !
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: C# - Arduino soros komunikáció

Hozzászólás Szerző: Robert »

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ű!
Wulfgar
Újonc
Újonc
Hozzászólások: 7
Csatlakozott: 2014. szeptember 1. hétfő, 13:17

Re: C# - Arduino soros komunikáció

Hozzászólás Szerző: Wulfgar »

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 ?
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: C# - Arduino soros komunikáció

Hozzászólás Szerző: Robert »

Szerintem ez kell neked Arduino oldalon. Igaz ebben 3 PWM van egymás után:

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);
    }
  }
}
http://arduino.cc/en/Tutorial/ReadASCIIString
Avatar
csabeszq
Bitfaragó
Hozzászólások: 678
Csatlakozott: 2012. szeptember 5. szerda, 6:00

Re: C# - Arduino soros komunikáció

Hozzászólás Szerző: csabeszq »

Wulfgar írta:Sajnos rosszul fogalmaztam az előző h.sz-ban. Szóval C#-ben nem tudok , csak karakterlánc formátumban küldeni.
Nos, erről nem a C# tehet (link).

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.
Wulfgar
Újonc
Újonc
Hozzászólások: 7
Csatlakozott: 2014. szeptember 1. hétfő, 13:17

Re: C# - Arduino soros komunikáció

Hozzászólás Szerző: Wulfgar »

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
Avatar
grezoo
Újonc
Újonc
Hozzászólások: 4
Csatlakozott: 2014. december 9. kedd, 12:42

Re: C# - Arduino soros komunikáció

Hozzászólás Szerző: grezoo »

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
}
}
}
Avatar
csabeszq
Bitfaragó
Hozzászólások: 678
Csatlakozott: 2012. szeptember 5. szerda, 6:00

Re: C# - Arduino soros komunikáció

Hozzászólás Szerző: csabeszq »

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.
Avatar
grezoo
Újonc
Újonc
Hozzászólások: 4
Csatlakozott: 2014. december 9. kedd, 12:42

Re: C# - Arduino soros komunikáció

Hozzászólás Szerző: grezoo »

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.???
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: C# - Arduino soros komunikáció

Hozzászólás Szerző: Robert »

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...
Avatar
grezoo
Újonc
Újonc
Hozzászólások: 4
Csatlakozott: 2014. december 9. kedd, 12:42

Re: C# - Arduino soros komunikáció

Hozzászólás Szerző: grezoo »

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);
}
}
}
Avatar
grezoo
Újonc
Újonc
Hozzászólások: 4
Csatlakozott: 2014. december 9. kedd, 12:42

Re: C# - Arduino soros komunikáció

Hozzászólás Szerző: grezoo »

@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?
Válasz küldése