L239D motorvezérő

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Avatar
zolsza
DrótVégénSzéndarab
Hozzászólások: 32
Csatlakozott: 2008. október 14. kedd, 6:00

L239D motorvezérő

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

int motorPin1a =4; // L239D motor1a
int motorPin1b=8; // L239D motor1b
int motorPin2a=7; // L239D motor2a
int motorPin2b=12; // L239D motor2b
int pwrpin1=6; // L239D PWM1
int pwrpin2=11; // L239D PWM2
int pot1 = 1; // potentiometer connected to analog pin 1
int pot2 = 2; // potentiometer connected to analog pin 2
int val = 512; // variable to store the read value
int val1= 512; // variable to store the read value
void setup()
{
pinMode (motorPin1a,OUTPUT); //L239D motor1a
pinMode (motorPin1b,OUTPUT); //L239D motor1b
pinMode (motorPin2a, OUTPUT); //L239D motor2a
pinMode (motorPin2b, OUTPUT); //L239D motor2b
pinMode (pwrpin1, OUTPUT); //L239D PWM1
pinMode (pwrpin2, OUTPUT); //L239D PWM2
}
void loop()
{
val = analogRead(pot1); // read the input pin
analogWrite(pwrpin1, val / 4); // analogRead values go from 0 to 1023, analogWrite values from 0 to 255
val1 = analogRead(pot2); // read the input pin
analogWrite(pwrpin2, val1 / 4); // analogRead values go from 0 to 1023, analogWrite values from 0 to 255
digitalWrite (motorPin1a, LOW);
digitalWrite (motorPin1b, HIGH);
digitalWrite (motorPin2a, HIGH);
digitalWrite (motorPin2b, LOW);

}
Ardunio Uno panel vezérli az AVR-Duino ShieldBoard-on megépitett L239D-t. Szerintetek evvel a programmal tudom vezérelni?
bakter
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

Elvileg lehet!
Gyakorlatilag pedig ki kel próbálni!
Majd kiderül mit kel még rajta javítani!
Az ritka mázli, ha valamiben rögtön elsőre minden jól működik.
:)
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

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

A lábak jól be annak kötve? Valami életjel? (a füst NEM az életjel :P )
Avatar
zolsza
DrótVégénSzéndarab
Hozzászólások: 32
Csatlakozott: 2008. október 14. kedd, 6:00

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

Kezdő kérdés :Az Ardunio panelek analóg bemenetein van belső felhúzó ellenállás? Mert ha nincs akkor logikusan a
(int pot1 = 1; // potentiometer connected to analog pin 1
int pot2 = 2; // potentiometer connected to analog pin 2)
bemenetekre kell kötnöm egy ellenállást, hogy a feszültségosztóként használt potméterek ne zárják rövidre az 5 voltos tápfeszültséget.
bakter
Avatar
zolsza
DrótVégénSzéndarab
Hozzászólások: 32
Csatlakozott: 2008. október 14. kedd, 6:00

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

Kérdés törölve (értelmetlen), Az AD átalakítóknak az analóg bemeneteken kell, hogy legyen bemenő ellenállása.
bakter
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

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

Belső felhúzóellállás alapban nincs bekapcsolva (meghamisítaná a mérést)

Viszont a kapcsrajzot te látod :) .

Bemenő (soros) ellenállása az AD konvertenek ~15...30 kohm. Az adatlapban ott a helyettesítő rajz.... (én 10k-ra emlékszem)
Avatar
zolsza
DrótVégénSzéndarab
Hozzászólások: 32
Csatlakozott: 2008. október 14. kedd, 6:00

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

int pwm1=6; // L239D 1 PWM1
int motor1a=7; // L239D 2 motor1a
int motor1b=12; // L239D 7 motor1b
int pwm2=11; // L239D 9 PWM2
int motor2b=8; // L239D 10 motor2b
int motor2a=4; // L239D 15 motor2a
int pot1=A4; // potentiometer connected to analog pin 4
int pot2=A5; // potentiometer connected to analog pin 5
int x; // variable to store the read value
int y; // variable to store the read value

void setup(){
pinMode (motor1a,OUTPUT); //L239D motor1a
pinMode (motor1b,OUTPUT); //L239D motor1b
pinMode (motor2a, OUTPUT); //L239D motor2a
pinMode (motor2b, OUTPUT); //L239D motor2b
pinMode (pwm1, OUTPUT); //L239D PWM1
pinMode (pwm2, OUTPUT); //L239D PWM2
pinMode (pot1, INPUT); //joystick 1
pinMode (pot2, INPUT); //joystick 2
}
void loop(){
x= analogRead(pot1);
byte x1=x/4;
analogWrite(pwm1,x1);
y= analogRead(pot2);
byte y1=y/4;
analogWrite(pwm2,y1);
digitalWrite (motor1a, LOW);
digitalWrite (motor1b, HIGH);
digitalWrite (motor2a, HIGH);
digitalWrite (motor2b, LOW);

}
Ez működik. :D
Már csak a motorok forgás-irányváltozását kell programozni.(Ezért olvassa be változóba a potenciométerek állását.)
Egy egyszerű kapcsolási rajzot is mellékelhetek hozzá, de sajnos nem tudom, hogy kell az oldalra képet feltölteni.
bakter
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

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

File Cserebere alá, ZIPben és egy miez.txt mellecsomagolva....
Avatar
zolsza
DrótVégénSzéndarab
Hozzászólások: 32
Csatlakozott: 2008. október 14. kedd, 6:00

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

http://avr.tavir.hu/modules/Upload/uplo ... _L239D.JPG
Mellékelve hozzá egy egyszerű kapcsolási rajz.
Programozásban teljesen kezdő vagyok, így bármilyen kritikát, észrevételt, segítséget szívesen fogadok.
jelenleg az eszköznek az előre-hátra menetet és fordulást jobbra-balra kellene tudnia.
Most ezzel (Ez előtti második hozzászólás) a programmal mindkét motor azonos irányban(előre) mozog, és külön szabályozható a motorok sebessége.
A problémák amiket szeretnék megoldani:
1. Hátramenet szabályozása külön mindkét motoron.
-----Ez egy legóból összerakott lánctalpas jármű motorvezérlője,
-----hátramenetek megoldanák a jobbra-balra fordulást is.
2. Mivel az irányítás gamapadból kiszerelt középállású potméterekkel
-----történik (egy mechanikus szerkezet középső állasban tartja a
-----potmétereket amennyiben nem nyúlok hozzájuk)
-----így ezek szoftveres figyelése, majd ezen értékekkel történő vezérlés
-----a cél. tulajdonképpen kettő darab analóg joystick.
3. A "probléma" ezzel, hogy az uno panel analóg bemenetein a jel nem
-----nulláról indul (Elméletileg 512-ről, középállas miatt)így
----- 512-1023-ig előre 511-0-ig hátra kellene mennie a motoroknak .
-----A motorok viszont jól 2.5- 6V tartományban működnek.
----- Így 512 érték alatt szinte meg sem mozdulnak, pedig 512- 0 értékig
-----hátramenetbe kapcsolva gyorsítani kellene a motorokat.

Ezt kellene megoldani szoftverből.Remélem valamennyire érthetően írtam le a problémát.
A programot magam szeretném megírni evvel is tanulva, viszont ötleteket, tanácsokat szívesen elfogadok, és hálásan köszönök.
bakter
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

Akkor kel neked 1 program elágazást készítened illetve 2-t a 2 motorra:
If PVM1 < 512 Then
Motor jobbra forog
digitalWrite (motor1a, LOW);
digitalWrite (motor1b, HIGH);
Else
Motor balra forog
digitalWrite (motor1b, LOW);
digitalWrite (motor1a, HIGH);
End if
(Mondjuk ez Bascom, de ügye te akarod megírni!)

Kezdésnek 2 irányváltás, aztán még a PVM jeleket is Illeszteni kellene.
A kettéosztott szintű üzemmódhoz.
Avatar
zolsza
DrótVégénSzéndarab
Hozzászólások: 32
Csatlakozott: 2008. október 14. kedd, 6:00

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

int pwm1=6; // L239D 1 PWM1
int motor1a=7; // L239D 2 motor1a
int motor1b=12; // L239D 7 motor1b
int pwm2=11; // L239D 9 PWM2
int motor2b=8; // L239D 10 motor2b
int motor2a=4; // L239D 15 motor2a
int pot1=A4; // potentiometer connected to analog pin 4
int pot2=A5; // potentiometer connected to analog pin 5
int x; // variable to store the read value
int y; // variable to store the read value
void setup(){
pinMode (motor1a,OUTPUT); //L239D motor1a
pinMode (motor1b,OUTPUT); //L239D motor1b
pinMode (motor2a, OUTPUT); //L239D motor2a
pinMode (motor2b, OUTPUT); //L239D motor2b
pinMode (pwm1, OUTPUT); //L239D PWM1
pinMode (pwm2, OUTPUT); //L239D PWM2
pinMode (pot1, INPUT); //joystick 1
pinMode (pot2, INPUT); //joystick 2

}
void loop(){
x= analogRead(pot1);
byte x1=x/4;

if (x<0 && x>512){
byte x2=x1-256*-1;
analogWrite(pwm2,x2);
}
else
{
analogWrite(pwm2,x1);
}
if (x>490 && x <510);
{
digitalWrite (motor1a, LOW);
digitalWrite (motor1b, LOW);
}
if (x>510 ){
digitalWrite (motor1a, HIGH);
digitalWrite (motor1b, LOW);
}
if (x<490 ){
digitalWrite (motor1a, LOW);
digitalWrite (motor1b, HIGH);
}

y= analogRead(pot2);
byte y1=y/4;
if (x>0 && x<512){
byte y2=y1-256*-1;
analogWrite(pwm1,y2);
}
else {
analogWrite(pwm1,y1);
}
if (y>480 && y<520);
{

digitalWrite (motor2a, LOW);
digitalWrite (motor2b, LOW);
}
if (y>520 ){
digitalWrite (motor2a, HIGH);
digitalWrite (motor2b, LOW);
}
if (y<480 ){

digitalWrite (motor2a, LOW);
digitalWrite (motor2b, HIGH);
}
}
Köszönöm a segítséget. Ezzel a programmal,már szinte tökéletesen működik a kis legórobot( gyermekeim nagy örömére). Most már csak a sebesség szabályozását szeretném megoldani. Táblázatból beolvasott értékekre gondoltam(10 érték előre 10 érték hátra), egy ilyen kis robotnak 10-10 sebesség szerintem bőven elég. Természetesen, ha valakinek van jobb ötlete szívesen veszem.
if (x>490 && x <510);
{
digitalWrite (motor1a, LOW);
digitalWrite (motor1b, LOW);

if (y>480 && y<520);
{

digitalWrite (motor2a, LOW);
digitalWrite (motor2b, LOW);
}

Ezeket a részeket azért kellet beleírnom mert a középállású potenciométerek nem pontosan 512-es értéket adtak vissza. Ezekkel az értékekkel minden bekapcsoláskor álló motorokat kapok.
bakter
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

Így nem kis késéssel indul a második motor?
Én átrendezném a programot.
Először beolvasnám mind a 2 analóg részt, és kiszámítanám a hozzájuk tartozó PWM értékeket.
Mivel ezek viszonylag hosszú műveletek.
Utána adnám ki a kapcsoló jeleket a motoroknak.
Így szerintem szebben futnának egyűt!
:idea:
Avatar
zolsza
DrótVégénSzéndarab
Hozzászólások: 32
Csatlakozott: 2008. október 14. kedd, 6:00

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

Kód: Egész kijelölése

int pwm1=6;                                   // L239D 1  PWM1
int motor1a=7;                                // L239D 2  motor1a
int motor1b=12;                               // L239D 7  motor1b
int pwm2=11;                                  // L239D 9  PWM2
int motor2b=8;                                // L239D 10 motor2b
int motor2a=4;                                // L239D 15 motor2a
int pot1=A4;                                  // potentiometer connected to analog pin 4
int pot2=A5;                                  // potentiometer connected to analog pin 5
int x;                                        // variable to store the read value
int y;                                        // variable to store the read value
void setup(){
  pinMode (motor1a,OUTPUT);                   //L239D motor1a
  pinMode (motor1b,OUTPUT);                   //L239D motor1b
  pinMode (motor2a, OUTPUT);                  //L239D motor2a
  pinMode (motor2b, OUTPUT);                  //L239D motor2b
  pinMode (pwm1, OUTPUT);                     //L239D PWM1      
  pinMode (pwm2, OUTPUT);                     //L239D PWM2
  pinMode (pot1, INPUT);                      //joystick 1
  pinMode (pot2, INPUT);                      //joystick 2
}


void loop(){
  x= analogRead(pot1);
  byte x1=x/4;
  y= analogRead(pot2);
  byte y1=y/4;

  if (x<0 && x>512){
    byte x2=x1-256*-1;
    analogWrite(pwm2,x2);
  }
  else
  {
    analogWrite(pwm2,x1);
  }
  if (x>490 && x <510);
  {
    digitalWrite (motor1a, LOW);
    digitalWrite (motor1b, LOW);
  }
  if (x>0 && x<512){
    byte y2=y1-256*-1;
    analogWrite(pwm1,y2);
  }
  else {
    analogWrite(pwm1,y1);
  }
  if (y>480 && y<520);
  {

    digitalWrite (motor2a, LOW);
    digitalWrite (motor2b, LOW);
  }
  if (x>490 && x <510);
  {
    digitalWrite (motor1a, LOW);
    digitalWrite (motor1b, LOW);
  }
  if (x>510 ){
    digitalWrite (motor1a, HIGH);
    digitalWrite (motor1b, LOW);
  }
  if (x<490 ){
    digitalWrite (motor1a, LOW);
    digitalWrite (motor1b, HIGH);
  }
  if (y>520 ){
    digitalWrite (motor2a, HIGH);
    digitalWrite (motor2b, LOW);
  }
  if (y<480 ){

    digitalWrite (motor2a, LOW);
    digitalWrite (motor2b, HIGH);
  }
}
"Először beolvasnám mind a 2 analóg részt, és kiszámítanám a hozzájuk tartozó PWM értékeket."

Átrendeztem kicsit a programot. A (kiszámítanám a hozzájuk tartozó PWM értékeket), részt a még nem megfelelő tudásszint miatt még nem biztos, hogy menni fog, de tanulok, fórum és könyvek stb. segítségével egyre jobban megy az AVR programozás :-)
bakter
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

Ha még nem érted! Éppen ezért kellene komentezni a programot!

Kód: Egész kijelölése

// Main
void loop(){
// Vezérlők beolvasása
   x = Analogread(pot1);
   Byte X1 = X / 4;
   y= analogRead(pot2);
   byte y1=y/4;

//  sebesség (PWM) számítás Ez még csak 1 irányba megy?
   if (x<0 && x>512){
      byte x2=x1-256*-1;
      analogWrite(pwm2,x2);
   }
   else
   {
      analogWrite(pwm2,x1);
   }

   if (y>0 && y<512){
      byte y2=y1-256*-1;
      analogWrite(pwm1,y2);
   }
   else
   {
      analogWrite(pwm1,y1);
   }

// Motorok irányba kapcsolása
   if (x>490 && x <510);
   {
      digitalWrite (motor1a, LOW);
      digitalWrite (motor1b, LOW);
   }


   if (y>480 && y<520);
   {
      digitalWrite (motor2a, LOW);
      digitalWrite (motor2b, LOW);
   }

   if (x>490 && x <510);
   {
      digitalWrite (motor1a, LOW);
      digitalWrite (motor1b, LOW);
   }

   if (x>510 ){
      digitalWrite (motor1a, HIGH);
      digitalWrite (motor1b, LOW);
   }

   if (x<490 ){
      digitalWrite (motor1a, LOW);
      digitalWrite (motor1b, HIGH);
   }

   if (y>520 ){
      digitalWrite (motor2a, HIGH);
      digitalWrite (motor2b, LOW);
   }

   if (y<480 ){
      digitalWrite (motor2a, LOW);
      digitalWrite (motor2b, HIGH);
   }
}
Így szerintem jobban olvasható lenne!
És próbáld meg egységesen használni a „{}” zárójelezést.
Mert könnyebb lesz később a hibakeresés!
8)
Avatar
zolsza
DrótVégénSzéndarab
Hozzászólások: 32
Csatlakozott: 2008. október 14. kedd, 6:00

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

Kód: Egész kijelölése

int k1 = 0;                                       // mikrokapcsoló1 Bal oldal  Ardunio Uno (digitális 0)
int k2 = 1;                                       // mikrokapcsoló2 Jobb oldal Ardunio Uno (digitális 1)
int be = 5;                                       // Bekapcsoló nyomógomb      Ardunio Uno (digitális 5)
int motor1a =7;                                   // L239D 2  motor1a          Ardunio Uno (digitális 7) 
int motor1b = 12;                                 // L239D 7  motor1b          Ardunio Uno (digitális 12)
int motor2b = 8;                                  // L239D 10 motor2b          Ardunio Uno (digitális 8)
int motor2a = 4;                                  // L239D 15 motor2a          Ardunio Uno (digitális 4)
int pwm1 = 6;                                     // L239D 1  PWM1             Ardunio Uno (digitális 6)
int pwm2 = 11;                                    // L239D 9  PWM2             Ardunio Uno (digitális 11)

void setup()
{
  digitalWrite(k1, HIGH);    //Belső felhuzóellenállás bekaocsolása (digitális 0) , ami alapbeállitás szerint bemenet
  digitalWrite(k2, HIGH);    //Belső felhuzóellenállás bekaocsolása (digitális 1) , ami alapbeállitás szerint bemenet
  digitalWrite(be, HIGH);    //Belső felhuzóellenállás bekaocsolása (digitális) 5 , ami alapbeállitás szerint bemenet
  pinMode (motor1a,OUTPUT);  //L239D motor1a (digitális 7)  beállitása kimenetnek
  pinMode (motor1b,OUTPUT);  //L239D motor1b (digitális 12)  beállitása kimenetnek
  pinMode (motor2a, OUTPUT); //L239D motor2a (digitális 4)  beállitása kimenetnek
  pinMode (motor2b, OUTPUT); //L239D motor2b (digitális 8)  beállitása kimenetnek
  pinMode (pwm1,   OUTPUT);  //Motor1 (digitális 6) inditás beállitása kimenetnek
  pinMode (pwm2, OUTPUT);    //Motor2 (digitális 11) inditás beállitása kimenetnek
 
}
void loop()
{
 if (digitalRead(be) == LOW)      //Bekapcsoló nyomógomb vizsgálata                
  {                                              
  digitalWrite(pwm1, HIGH);       //Motor1 bekapcsolása ha be nyomogombot megnyomták                                         
  digitalWrite(pwm2, HIGH);       //Motor2 bekapcsolása ha be nyomogombot megnyomták
  }
 if (digitalRead(k1) == HIGH)     //k1 mikrokapcsoló vizsgálata
  {                               //Motor1 irányának vezérlése
  digitalWrite (motor1a, HIGH);   //Motor1 előre ha k1 mikrokapcsoló nincs benyomva
  digitalWrite (motor1b, LOW);
  }
 else
  {
    digitalWrite (motor1a, LOW);  //Mindkét motor hátra 0.8 mp-ig ha k1 mikrokapcsolót megnyomták  
    digitalWrite (motor1b,HIGH );
    digitalWrite (motor2a, LOW);
    digitalWrite (motor2b, HIGH);
    delay(800);
    digitalWrite (motor1a,LOW );  //Fordulás jobbra 1 mp-ig ha k1 mikrokapcsolót megnyomták 
    digitalWrite (motor1b, HIGH);
    digitalWrite (motor2a, HIGH);
    digitalWrite (motor2b, LOW);
    delay(1000);
 
  }                               
 if (digitalRead(k2) == HIGH)     //k2 mikrokapcsoló vizsgálata    
  {                               //Motor2 irányának vezérlése
  digitalWrite (motor2a, HIGH);   //Motor2 előre ha k2 mikrokapcsoló nincs benyomva 
  digitalWrite (motor2b, LOW);
  }
 else
  {
  digitalWrite (motor2a, LOW);    //Mindkét motor hátra 0.8 mp-ig ha k2 mikrokapcsolót megnyomták
  digitalWrite (motor2b, HIGH);
  digitalWrite (motor1a, LOW);
  digitalWrite (motor1b,HIGH );
  delay(800);
  digitalWrite (motor2a, LOW);    //Fordulás balra 1 mp-ig ha k2 mikrokapcsolót megnyomták
  digitalWrite (motor2b, HIGH);
  digitalWrite (motor1a, HIGH);
  digitalWrite (motor1b, LOW);
  delay(1000);

  
  }
}
Ez a kis program a pár hozzászólássál előbb feltöltött kapcsolási rajz alapján készített (Ardunio UNO, próbapanelen L239d) összerakott áramkört vezérli. Most az előző programtól éltérően "önjáró" robotot vezérel amely képes kikerülni akadályokat. kezdőknek(mint én)jó lehet tanulásra. Ezért is, ha valaki tudd rajta bármit javítani azt köszönöm.
bakter
Válasz küldése