Quick Guide: Arduino Driver libraries

Atmel, PIC, VEX, Fischertechnik

Moderator: Moderatoren

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5256
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Re: Baustelle: Arduino Driver libraries: Displays, SD, I2C, UART,...

Beitragvon HaWe » 15. Sep 2015 15:40

Infrared Remote Library für Arduino (Baustelle)

Bild

http://www.righto.com/2009/08/multi-pro ... brary.html
https://github.com/z3t0/Arduino-IRremote

Code: Alles auswählen

/*
 * IR Remote Receive Test
 * Copyright (c) 2016 Philipp Henkel
 */
 
// https://github.com/z3t0/Arduino-IRremote
// The examples/IRrecvDemo sketch provides a simple example of how to receive codes:

#include <IRremote.h>

int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
}

void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    irrecv.resume(); // Receive the next value
  }
}



inkl. Lego Power Functions Remote Unterstützung:
https://github.com/z3t0/Arduino-IRremot ... sTests.ino

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5256
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Arduino Driver libraries (Baustelle): Displays, SD, I2C, UART,...

Beitragvon HaWe » 15. Sep 2015 15:40

(Platzhalter)

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5256
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Re: Baustelle: Arduino Driver libraries: Displays, SD, I2C, UART,...

Beitragvon HaWe » 15. Sep 2015 15:40


DONATE / SPENDE:
Gefällt dir dieses Kompendium und möchtest du dafür einen kleinen Betrag über PAYPAL spenden ?
Dann klicke einfach auf diesen Link -
Ab einer Spende ab EUR 5,- kannst du auf Wunsch dieses Kompendium auch als kostenloses WORD.doc erhalten (per Email oder Download als .zip):

-> Ja, ich möchte etwas als Anerkennung spenden <-


Ein ganz herzliches Dankeschön! :prima:

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5256
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Re: Baustelle: Arduino Driver libraries: Displays, SD, I2C, UART,...

Beitragvon HaWe » 15. Sep 2015 15:44

Arduino-Libs für Lego Mindstorms NXT-Sensoren

Lego-Stecker-Pins :

Bild


NXT Taster (Touch-Sensor) :
http://www.thecompblog.com/2012/07/hacking-lego-nxt-part-2.html
NXTTouchSensor_Fritzing.jpg

Code: Alles auswählen

*
This is a program to test the Lego NXT Touch Sensor.
A schematic of the circuit required can be found on TheCompBlog.com.
This code was writen (badly) by Nicolas Weninger, author of TheCompBlog.com.

THIS SOFTWARE COMES WITHOUT ANY WARRANTY, IMPLIED OR EXPLICIT, TO THE MAXIMUM EXTENT PERMITTABLE BY LAW. THIS INCLUDES
WARRANTY AGAINST DAMAGE TO COMPUTER SYSTEMS OR DATA, LOSS OF PROFIT, PERSONAL INJURY OR DEATH.
 
This code is in the public domain.
*/

const int button = 2; //connects to pin3 of the sensor

void setup()
{
  Serial.begin(9600);
  pinMode(13, OUTPUT);
}

void loop()
{
  if(digitalRead(button) == 1)
  {
    digitalWrite(13, HIGH);
  }
  else
  {
    digitalWrite(13, LOW);
  }
  Serial.println(digitalRead(button));
}



NXT-Lichtsensor (Light-Sensor):
http://www.thecompblog.com/2012/07/hacking-lego-nxt-part-2.html
NXTLightSensor_Fritzing.jpg


Code: Alles auswählen

/*
This is a program to test the Lego NXT Light Sensor.
A schematic of the circuit required can be found on TheCompBlog.com.
This code was writen (badly) by Nicolas Weninger, author of TheCompBlog.com.

THIS SOFTWARE COMES WITHOUT ANY WARRANTY, IMPLIED OR EXPLICIT, TO THE MAXIMUM EXTENT PERMITTABLE BY LAW. THIS INCLUDES
WARRANTY AGAINST DAMAGE TO COMPUTER SYSTEMS OR DATA, LOSS OF PROFIT, PERSONAL INJURY OR DEATH.
 
This code is in the public domain.
*/

const int reader = A5; //connects to pin1 of sensor
const int button = 2; //momentary switch
const int light = 3; //connects to pin5 of sensor

int state = LOW;
int previous = LOW;

void setup()
{
  Serial.begin(9600);
  pinMode(light, OUTPUT);
}

void loop()
{
  int reading = digitalRead(button);
  if(reading == HIGH && previous == LOW)
  {
    if(state == HIGH)
    {
      state = LOW;
    }
    else
    {
      state = HIGH;
    }
  }
 
  digitalWrite(light, state);
  previous = reading;
  Serial.println(analogRead(reader)); //print the light level reading
  delay(10); //good practice after an analogRead. Don't know why though…
}





NXT Geräuschsensor (Sound Sensor):
http://www.thecompblog.com/2012/08/hacking-lego-nxt-part-3.html
NXTSoundSensor_Fritzing.jpg


Code: Alles auswählen

/*
  This code reads the analog value of the Lego NXT sound sensor.
  The schematic can be found on thecompblog.com
 
  This code was written (badly) by Nicolas Weninger, auther of TheCompBlog.
  THIS SOFTWARE COMES WITHOUT ANY WARRANTY, IMPLIED OR EXPLICIT, TO THE MAXIMUM EXTENT PERMISSIBLE BY LAW.

  THIS INCLUDES WARRANTY AGAINST DAMAGE TO COMPUTER SYSTEMS, LOSS OF PROFIT, PERSONAL INJURY OR DEATH.
 
  This code is in the public domain.
*/

const int mic = A5;

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  Serial.println(analogRead(mic));
  delay(10);
}



NXT Ultraschallsensor (Ultrasonic Sensor)
http://www.thecompblog.com/2012/08/hacking-lego-nxt-part-3.html
http://blog.tkjelectronics.dk/2011/10/nxt-shield-ver2/
http://blog.tkjelectronics.dk/wp-content/uploads/Appendix-7-LEGO-MINDSTORMS-NXT-Ultrasonic-Sensor-I2C-communication-protocol.pdf
NXTUSS_Fritzing.jpg

notwendige i2cmaster.h library für NXT USS:
i2cmaster.zip
(6.25 KiB) 122-mal heruntergeladen



Code: Alles auswählen

#include <i2cmaster.h>

byte clockPin = 4;
byte buf[9];//Buffer to store the received valeus
byte addr = 0x02;//address 0x02 in a 8-bit context - 0x01 in a 7-bit context
byte distance;

void setup()

  i2c_init();//I2C frequency = 11494,253Hz
  Serial.begin(115200);
  printUltrasonicCommand(0x00);//Read Version
  printUltrasonicCommand(0x08);//Read Product ID
  printUltrasonicCommand(0x10);//Read Sensor Type
  printUltrasonicCommand(0x14);//Read Measurement Units 
}

void loop()
{   
//  printUltrasonicCommand(0x42);//Read Measurement Byte 0
  distance = readDistance();
  if(distance == 0xFF)
    Serial.println("Error Reading Distance");
  else
    Serial.println(distance, DEC);   
}
byte readDistance()

  delay(100);//There has to be a delay between commands
  byte cmd = 0x42;//Read Measurement Byte 0
   
  pinMode(clockPin, INPUT);//Needed for writing to work
  digitalWrite(clockPin, HIGH); 
 
  if(i2c_start(addr+I2C_WRITE))//Check if there is an error
  {
    Serial.println("ERROR i2c_start");
    i2c_stop();
    return 0xFF;
  }   
  if(i2c_write(cmd))//Check if there is an error
  {
    Serial.println("ERROR i2c_write");
    i2c_stop();
    return 0xFF;
  } 
  i2c_stop();
   
  delayMicroseconds(60);//Needed for receiving to work
  pinMode(clockPin, OUTPUT);
  digitalWrite(clockPin, LOW);
  delayMicroseconds(34);
  pinMode(clockPin, INPUT);
  digitalWrite(clockPin, HIGH);
  delayMicroseconds(60); 
   
  if(i2c_rep_start(addr+I2C_READ))//Check if there is an error
  {
    Serial.println("ERROR i2c_rep_start");
    i2c_stop();   
    return 0xFF;
  } 
  for(int i = 0; i < 8; i++)
    buf[i] = i2c_readAck();
  buf[8] = i2c_readNak(); 
  i2c_stop();
 
  return buf[0]; 
}

void printUltrasonicCommand(byte cmd)
{
  delay(100);//There has to be a delay between commands
   
  pinMode(clockPin, INPUT);//Needed for writing to work
  digitalWrite(clockPin, HIGH);
 
  if(i2c_start(addr+I2C_WRITE))//Check if there is an error
  {
    Serial.println("ERROR i2c_start");
    i2c_stop();
    return;
  }
  if(i2c_write(cmd))//Check if there is an error
  {
    Serial.println("ERROR i2c_write");
    i2c_stop();
    return;
  }
  i2c_stop();
   
  delayMicroseconds(60);//Needed for receiving to work
  pinMode(clockPin, OUTPUT);
  digitalWrite(clockPin, LOW);
  delayMicroseconds(34);
  pinMode(clockPin, INPUT);
  digitalWrite(clockPin, HIGH);
  delayMicroseconds(60); 

  if(i2c_rep_start(addr+I2C_READ))//Check if there is an error
  {
    Serial.println("ERROR i2c_rep_start");
    i2c_stop();
    return;
  }
  for(int i = 0; i < 8; i++)
    buf[i] = i2c_readAck();
  buf[8] = i2c_readNak();
  i2c_stop(); 
 
  if(cmd == 0x00 || cmd == 0x08 || cmd == 0x10 || cmd == 0x14)
  {
      for(int i = 0; i < 9; i++)
      {
        if(buf[i] != 0xFF && buf[i] != 0x00)
          Serial.print(buf[i]);
        else
          break;
      }             
  }
  else
    Serial.print(buf[0], DEC); 

  Serial.println("");     
}
/*
' Wires on NXT jack plug.
' Wire colours may vary. Pin 1 is always end nearest latch.
' 1 White +9V
' 2 Black GND
' 3 Red GND
' 4 Green +5V
' 5 Yellow SCL - also connect clockpin to give a extra low impuls
' 6 Blue SDA
' Do not use i2c pullup resistor - already provided within sensor.
*/

verwendete i2cmaster-Library:
i2cmaster.zip
(6.25 KiB) 122-mal heruntergeladen




weitere Links zu Arduino-Libs für Lego Mindstorms EV3-Sensoren

Driver und Source Code, um EV3-Sensoren an Arduinos zu betreiben:

https://lejosnews.wordpress.com/2014/05 ... t-sensors/

https://github.com/lawrie/EV3_Dexter_In ... V3_arduino

https://github.com/lawrie/EV3_Dexter_In ... UARTSensor

(danke an Andy Shaw (leJOS) und Lawrie Griffiths (Dexter Industries) ! :)

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5256
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Re: Baustelle: Arduino Driver libraries: Displays, SD, I2C, UART,...

Beitragvon HaWe » 15. Sep 2015 15:44

Platzhalter

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5256
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Re: Baustelle: Arduino Driver libraries: Displays, SD, I2C, UART,...

Beitragvon HaWe » 15. Sep 2015 15:44

Platzhalter

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5256
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Re: Baustelle: Arduino Driver libraries: Displays, SD, I2C, UART,...

Beitragvon HaWe » 19. Sep 2015 19:01

Platzhalter

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5256
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Re: Arduino Driver libraries (Baustelle): Displays, SD, I2C, UART,...

Beitragvon HaWe » 19. Sep 2015 19:09

Platzhalter

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5256
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Re: Arduino Driver libraries (Baustelle): Displays, SD, I2C, UART,...

Beitragvon HaWe » 24. Nov 2015 17:59


DONATE / SPENDE:
Gefällt dir dieses Kompendium und möchtest du dafür einen kleinen Betrag über PAYPAL spenden ?
Dann klicke einfach auf diesen Link -
Ab einer Spende ab EUR 5,- kannst du auf Wunsch dieses Kompendium auch als kostenloses WORD.doc erhalten (per Email oder Download als .zip):

-> Ja, ich möchte etwas als Anerkennung spenden <-


Ein ganz herzliches Dankeschön! :prima:

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5256
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Re: Arduino Driver libraries (Baustelle): Displays, SD, I2C, UART,...

Beitragvon HaWe » 17. Feb 2016 16:30

Auslesen von Encoderwerten mit einem Arduino:

LegoEncoder2+3_Steckplatine.jpg

Pin-Belegung für die Verwendung von Lego Mindstorms RJ11-Steckern:

Encoder-Anschlüsse an Pins 5+6 (gelb/blau)
Pin3=GND (Lego-Farbcodierung=rot!!), Pin4=+Vc (+3,3...+5V, Lego-Farbcodierung=grün!!)

Code: Alles auswählen

#define  encoderA   2
#define  encoderB   3

pinMode(encoderA, INPUT_PULLUP);
pinMode(encoderB, INPUT_PULLUP);



Variante 1:
Auslesen der Encoder per Arduino Uno / Mega :


Code: Alles auswählen

/************************************************************
*
* Demo-Programm zur Auswertung eines manuell betriebenen
* Drehencoders (Quadraturencoder) mit dem Arduino im
* Timer-Interrupt mit einer Abfragefrequenz von rd. 1kHz
*
* Kann von jederman frei verwendet werden, aber bitte den
* Hinweis: "Entnommen aus http://www.meinDUINO.de" einfügen
*
************************************************************/

// An die Pins 2 und 3 ist der Encoder angeschlossen
#define encoderA 2
#define encoderB 3

// Globale Variablen zur Auswertung in der
// Interrupt-Service-Routine (ISR)
volatile int8_t altAB = 0;
volatile int encoderWert = 0;

// Die beiden Schritt-Tabellen für volle oder 1/4-Auflösung
// 1/1 Auflösung
//int8_t schrittTab[16] = {0,-1,1,0,1,0,0,-1,-1,0,0,1,0,1,-1,0};

// 1/2 Auflösung ergibt bei Lego-Motoren 1 tick pro Grad (standard wie bei Lego)
int8_t schrittTab[16] = {0, 0,0,0,1,0,0,-1, 0,0,0,1,0,0,-1,0};


// 1/4 Auflösung
//int8_t schrittTab[16] = {0,0,0,0,0,0,0,-1,0,0,0,0,0,1,0,0};


/*************************************************************
*
* Interrupt Service Routine
*
* Wird aufgerufen, wenn der entsprechende Interrupt
* ausgelöst wird
*
*************************************************************/
ISR(TIMER1_COMPA_vect) {
  altAB <<= 2;
  altAB &= B00001100;
  altAB |= (digitalRead(encoderA) << 1) | digitalRead(encoderB);
  encoderWert += schrittTab[altAB];
}


/*************************************************************
*
* void setup()
*
* Wird einmal beim Programmstart ausgeführt
*
*************************************************************/
void setup() {
  pinMode(encoderA, INPUT);
  pinMode(encoderB, INPUT);
 
  noInterrupts(); // Jetzt keine Interrupts
  TIMSK1 |= (1<<OCIE1A);  // Timer 1 Output Compare A Match Interrupt Enable

  TCCR1A = 0; // "Normaler" Modus

  // WGM12: CTC-Modus einschalten (Clear Timer on Compare match)
  //        Stimmen OCR1A und Timer überein, wird der Interrupt
  //        ausgelöst
  // Bit CS12 und CS10 setzen = Vorteiler: 1024
  TCCR1B = (1<<WGM12) | (1<<CS12) | (1<<CS10);

  // Frequenz = 16000000 / 1024 / 15 = rd. 1kHz Abtastfrequenz;
  // Überlauf bei 14, weil die Zählung bei 0 beginnt
  OCR1A = 14;
 
  interrupts(); // Interrupts wieder erlauben

  Serial.begin(115200);
}


/*************************************************************
*
* void loop()
*
* Wird immer wieder durchlaufen
*
*************************************************************/
void loop() {
 
  while(true) {
    Serial.println(encoderWert);
    delay(100);
  }
}





////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



Variante 2:
Quadratur-Encoder auslesen mit Arduino Due (per Due-Timer):


Code: Alles auswählen

/************************************************************
* Programm zur Auswertung eines manuell betriebenen
* Drehencoders (Quadraturencoder) mit dem Arduino Due
* per Due-Timer mit einer Abfragefrequenz von rd. 4-10kHz
* Entlehnt an http ://www.meinDUINO.de 
************************************************************/
#include <DueTimer.h>

char sbuf[100];

#define MAXMOTORS           6 // max number of encoder motors at Arduino Uno=2 // Due=6 // Mega=8



// motor 0
#define pinenc0A   22  // enc0A yellow
#define pinenc0B   23  // enc0B blue
#define pinmot0d1  24  // dir0-1   <<
#define pinmot0d2  25  // dir0-2
#define pinmot0pwm 10  // pwm enable0   

// motor 1
#define pinenc1A   26  // enc1A yellow
#define pinenc1B   27  // enc1B blue
#define pinmot1d1  28  // dir1-1   <<
#define pinmot1d2  29  // dir1-2
#define pinmot1pwm  9  // pwm enable1   


// motor 2
#define pinenc2A   30  // enc2A yellow
#define pinenc2B   31  // enc2B blue
#define pinmot2d1  32  // dir2-1   <<
#define pinmot2d2  33  // dir2-2
#define pinmot2pwm  8  // pwm enable2   

// motor 3
#define pinenc3A   34  // enc3A yellow
#define pinenc3B   35  // enc3B blue
#define pinmot3d1  36  // dir3-1   <<
#define pinmot3d2  37  // dir3-2
#define pinmot3pwm  7  // pwm enable3   

// motor 4
#define pinenc4A   38  // enc4A yellow
#define pinenc4B   39  // enc4B blue
#define pinmot4d1  40  // dir4-1   <<
#define pinmot4d2  41  // dir4-2
#define pinmot4pwm  6  // pwm enable4   

// motor 5
#define pinenc5A   42  // enc5A yellow
#define pinenc5B   43  // enc5B blue
#define pinmot5d1  47  // dir5-1   <<
#define pinmot5d2  48  // dir5-2
#define pinmot5pwm  5  // pwm enable5   





volatile long   motenc[MAXMOTORS]    = {0, 0, 0, 0, 0, 0},
                oldenc[MAXMOTORS]    = {0, 0, 0, 0, 0, 0};
               
byte pinmotdir[MAXMOTORS][ 2] = {
  {pinmot0d1, pinmot0d2},   // motor direction pin array
  {pinmot1d1, pinmot1d2},
  {pinmot2d1, pinmot2d2},
  {pinmot3d1, pinmot3d2},
  {pinmot4d1, pinmot4d2},
  {pinmot5d1, pinmot5d2},
};

int  pinmotpwm[MAXMOTORS] =      {pinmot0pwm, pinmot1pwm, pinmot2pwm,  // motor pwm pin array
                                  pinmot3pwm, pinmot4pwm, pinmot5pwm,
                                 };

volatile int8_t ISRab[MAXMOTORS]     = {0, 0, 0, 0, 0, 0};

// 1/1 Auflösung
//int8_t schrittTab[16] = {0,-1,1,0,1,0,0,-1,-1,0,0,1,0,1,-1,0};

// 1/2 Auflösung ergibt bei Lego-Motoren 1 tick pro Grad (standard wie bei Lego)
int8_t schrittTab[16] = {0, 0,0,0,1,0,0,-1, 0,0,0,1,0,0,-1,0};

// 1/4 Auflösung
//int8_t schrittTab[16] = {0,0,0,0,0,0,0,-1,0,0,0,0,0,1,0,0};


                               
                                 
/*************************************************************
* Interrupt Handler Routine
*************************************************************/

void encHandler() {
 
  ISRab [ 0] <<= 2;
  ISRab [ 0] &= B00001100;
  ISRab [ 0] |= (digitalRead(pinenc0A) << 1) | digitalRead(pinenc0B);
  motenc[ 0] += schrittTab[ISRab[0]];           //

  ISRab [ 1] <<= 2;
  ISRab [ 1] &= B00001100;
  ISRab [ 1] |= (digitalRead(pinenc1A) << 1) | digitalRead(pinenc1B);
  motenc[ 1] += schrittTab[ISRab[1]];           //

  ISRab [ 2] <<= 2;
  ISRab [ 2] &= B00001100;
  ISRab [ 2] |= (digitalRead(pinenc2A) << 1) | digitalRead(pinenc2B);
  motenc[ 2] += schrittTab[ISRab[2]];           //

  ISRab [ 3] <<= 2;
  ISRab [ 3] &= B00001100;
  ISRab [ 3] |= (digitalRead(pinenc3A) << 1) | digitalRead(pinenc3B);
  motenc[ 3] += schrittTab[ISRab[3]];           //

  ISRab [ 4] <<= 2;
  ISRab [ 4] &= B00001100;
  ISRab [ 4] |= (digitalRead(pinenc4A) << 1) | digitalRead(pinenc4B);
  motenc[ 4] += schrittTab[ISRab[4]];           //

  ISRab [ 5] <<= 2;
  ISRab [ 5] &= B00001100;
  ISRab [ 5] |= (digitalRead(pinenc5A) << 1) | digitalRead(pinenc5B);
  motenc[ 5] += schrittTab[ISRab[5]];           //

 
}


void setup() {
  // motor pin settings
  // setup for L293D motor driver

     // motor 0
     pinMode(pinenc0A, INPUT_PULLUP);   // enc0A    yellow
     pinMode(pinenc0B, INPUT_PULLUP);   // enc0B    blue
     pinMode(pinmot0d1, OUTPUT);        // dir0-1   
     pinMode(pinmot0d2, OUTPUT);        // dir0-2   
     pinMode(pinmot0pwm ,OUTPUT);       // enable0 
       
     // motor 1
     pinMode(pinenc1A, INPUT_PULLUP);   // enc1A    yellow
     pinMode(pinenc1B, INPUT_PULLUP);   // enc1B    blue
     pinMode(pinmot1d1, OUTPUT);        // dir1-1   
     pinMode(pinmot1d2, OUTPUT);        // dir1-2 
     pinMode(pinmot1pwm, OUTPUT);       // enable1
       
     // motor 2
     pinMode(pinenc2A, INPUT_PULLUP);   // enc2A    yellow
     pinMode(pinenc2B, INPUT_PULLUP);   // enc2B    blue
     pinMode(pinmot2d1, OUTPUT);        // dir2-1 
     pinMode(pinmot2d2, OUTPUT);        // dir2-2   
     pinMode(pinmot2pwm, OUTPUT);       // enable2 
       
     // motor 3
     pinMode(pinenc3A, INPUT_PULLUP);   // enc3A     yellow
     pinMode(pinenc3B, INPUT_PULLUP);   // enc3B     blue
     pinMode(pinmot3d1, OUTPUT);        // dir3-1   
     pinMode(pinmot3d2, OUTPUT);        // dir3-2 
     pinMode(pinmot3pwm, OUTPUT);       // enable3 
       
     // motor 4
     pinMode(pinenc4A, INPUT_PULLUP);   // enc4A     yellow
     pinMode(pinenc4B, INPUT_PULLUP);   // enc4B     blue
     pinMode(pinmot4d1, OUTPUT);        // dir4-1   
     pinMode(pinmot4d2, OUTPUT);        // dir4-2 
     pinMode(pinmot4pwm, OUTPUT);       // enable4 
       
     // motor 5
     pinMode(pinenc5A, INPUT_PULLUP);   // encA5     yellow
     pinMode(pinenc5B, INPUT_PULLUP);   // encB5     blue
     pinMode(pinmot5d1, OUTPUT);        // dir5-1   
     pinMode(pinmot5d2, OUTPUT);        // dir5-2   
     pinMode(pinmot5pwm, OUTPUT);       // enable5
       

 
   Timer1.attachInterrupt(encHandler);
   Timer1.start(100); // Calls every ...µs

   Serial.begin(115200);
   Serial.println( "safety delay before start");
   delay(1000);  // safety delay before start
   Serial.println();
}


void loop() {
 
  while(true) {
     sprintf(sbuf, " 0=%6d, 1=%6d, 2=%6d, 3=%6d, 4=%6d, 5=%6d",
             motenc[ 0], motenc[ 1], motenc[ 2], motenc[ 3], motenc[ 4], motenc[ 5]);
     Serial.println(sbuf);
     delay(100);
  }
}



Pin-Belegung für die Verwendung von Lego Mindstorms RJ11-Steckern:
Encoder auf pins 5+6 (gelb + blau)

Bild
Gruß,
HaWe
±·≠≈²³αβγδε∂ζλμνπξφωΔΦ≡ΠΣΨΩ∫√∀∃∈∉∧∨¬⊂⊄∩∪∅∞®
NXT NXC SCHACHROBOTER: https://www.youtube.com/watch?v=Cv-yzuebC7E

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5256
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Re: Arduino Driver libraries (Baustelle): Displays, SD, I2C, UART,...

Beitragvon HaWe » 17. Feb 2016 16:32

Ansteuern von DC-Motoren per L293D H-Brücke:

Bild
http://www.arduino-tutorial.de/2010/06/ ... bridge-ic/

Code: Alles auswählen

int motor1_A=11;
int motor1_B=10;
int motor1_Speed=9;
 
int motor2_A=5;
int motor2_B=4;
int motor2_Speed=3;
 
void setup(){
  pinMode(motor1_A,OUTPUT);
  pinMode(motor1_B,OUTPUT);
 
  pinMode(motor2_A,OUTPUT);
  pinMode(motor2_B,OUTPUT);
}
 
void loop(){
  // motor1
  for (int i=0; i>256; i+=5){
    digitalWrite(motor1_A,HIGH); // A = HIGH and B = LOW means the motor will turn right
    digitalWrite(motor1_B,LOW);
    analogWrite(motor1_Speed,i); // speed counts from 0 to 255
    delay(20);
  }
  for (int i=255; i>0; i-=5){
    digitalWrite(motor1_A,HIGH); // A = HIGH and B = LOW means the motor will turn right
    digitalWrite(motor1_B,LOW);
    analogWrite(motor1_Speed,i); // speed counts from 0 to 255
    delay(20);
  }
  // motor2
  for (int i=0; i<256; i+=5){
    digitalWrite(motor2_A,HIGH); // A = HIGH and B = LOW means the motor will turn right
    digitalWrite(motor2_B,LOW);
    analogWrite(motor2_Speed,i); // speed counts from 0 to 255
    delay(20);
  }
  for (int i=255; i>0; i-=5){
    digitalWrite(motor2_A,HIGH); // A = HIGH and B = LOW means the motor will turn right
    digitalWrite(motor2_B,LOW);
    analogWrite(motor2_Speed,i); // speed counts from 0 to 255
    delay(20);
  }
 
  // turn vice versa
 
  // motor1
  for (int i=0; i<256; i+=5){
    digitalWrite(motor1_A,LOW); // A = LOW and B = HIGH means the motor will turn left
    digitalWrite(motor1_B,HIGH);
    analogWrite(motor1_Speed,i); // speed counts from 0 to 255
    delay(20);
  }
  for (int i=255; i>0; i-=5){
    digitalWrite(motor1_A,LOW); // A = LOW and B = HIGH means the motor will turn left
    digitalWrite(motor1_B,HIGH);
    analogWrite(motor1_Speed,i); // speed counts from 0 to 255
    delay(20);
  }
  // motor2
  for (int i=0; i<256; i+=5){
    digitalWrite(motor2_A,LOW); // A = LOW and B = HIGH means the motor will turn left
    digitalWrite(motor2_B,HIGH);
    analogWrite(motor2_Speed,i); // speed counts from 0 to 255
    delay(20);
  }
  for (int i=255; i>0; i-=5){
    digitalWrite(motor2_A,LOW); // A = LOW and B = HIGH means the motor will turn left
    digitalWrite(motor2_B,HIGH);
    analogWrite(motor2_Speed,i); // speed counts from 0 to 255
    delay(20);
  }
}


Die Dokus zu den L293D sind ziemlich besch***** durcheinander im Web, jeder bezeichnet sie anders. Hier mal ganz super-ausführlich auch für komplette Neulinge:
enable1: pwm Signal Motor1
in1, in2: dig Richtungs-Pins für Motor1
out1, out2: Ausgänge für Motor1

enable2: pwm Signal Motor2
in3, in4: dig Richtungs-Pins für Motor2
out3, out4: Ausgänge für Motor2

VSS: 5V vom Arduino
VS: Borne (+): +9...12V von Batterie
GND: Arduino-GND (-) mit Leistungs-Batterie (Borne (-)) verbinden;
im L293D sind alle 4 GND Leitungen bereits intern verbunden, es reicht auf dem Steckbrett also 1 einziges GND-Verbindungskabel
(verändert, ergänzt)

Bild
Quelle: http://www.daedalus.ei.tum.de/index.php ... 1/hardware

Bild
Quelle: http://www.google.de/imgres?imgurl=http ... 56&bih=816

Pin-Belegung für die Verwendung von Lego Mindstorms RJ11-Steckern:

Motor-Anschlüsse an Pins 1+2 (weiß/schwarz):

Bild
Gruß,
HaWe
±·≠≈²³αβγδε∂ζλμνπξφωΔΦ≡ΠΣΨΩ∫√∀∃∈∉∧∨¬⊂⊄∩∪∅∞®
NXT NXC SCHACHROBOTER: https://www.youtube.com/watch?v=Cv-yzuebC7E

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5256
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Re: Arduino Driver libraries (Baustelle): Displays, SD, I2C, UART,...

Beitragvon HaWe » 23. Feb 2016 18:27


DONATE / SPENDE:
Gefällt dir dieses Kompendium und möchtest du dafür einen kleinen Betrag über PAYPAL spenden ?
Dann klicke einfach auf diesen Link -
Ab einer Spende ab EUR 5,- kannst du auf Wunsch dieses Kompendium auch als kostenloses WORD.doc erhalten (per Email oder Download als .zip):

-> Ja, ich möchte etwas als Anerkennung spenden <-


Ein ganz herzliches Dankeschön! :prima:

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5256
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Re: Arduino Driver libraries (Baustelle): Displays, SD, I2C, UART,...

Beitragvon HaWe » 23. Feb 2016 21:33

(analog) Sharp IR Distanz-Sensoren
GP2D120 ( 4-30cm )
GP2D12 ( 10-80cm )
GP2Y0A21YK0F ( 10-80cm )

Bild
Bezugsquellen z.B.
http://techdelivers.com/index.php?route ... arch=sharp
http://www.idealo.de/preisvergleich/Typ ... 16668.html

Quellen:
http://techdelivers.com/index.php?route ... arch=sharp
http://www.trossenrobotics.com/productd ... 21YK0F.pdf
http://www.trossenrobotics.com/productdocs/GP2D12.pdf
http://www.picbasic.co.uk/forum/showthread.php?t=7705

Berechnung der Entfernung

Code: Alles auswählen

(1)   Vs = 1 / ( Dcm + k )

Vs ist die Sensor-Ausgabespannung
Dcm ist die Distanz des Objektes in cm
k sind Konstanten für die jew. Sensoren:
GP2D120: k = 0,42
GP2D12 : k = 4,0
GP2Y0A21YK0F: k = 2,0

<=>
(2)   Dcm = (1 / Vs) - k

bei ADC Messung 10bit (ADv = 0...1023) gilt:
(3)   Vs = ADv * (Vref/1023) = (ADv*Vref) / 1023
Vs ist die Sensor-Spannung,
Vref die Referenzspannung der MCU (5V oder 3,3V)
ADv ist der ermittelte analoge Sensor-ADC-Wert.

Setzt man (3)  in (2) ein, erhält man zur Entfernungsberechnung aus dem ADC-Wert:

(4) Dcm = ( (1/ADv) * (1023/Vref) ) - k

zum Nacheichen lässt sich optional ein Eichfaktor c gut verwenden:

(5) Dcm = c * ( (1/ADv) * (1023/Vref) ) - k
mit c meist im Bereich 1,0 (+/- 0,3)


 

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5256
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Re: Arduino Driver libraries (Baustelle): Displays, SD, I2C, UART,...

Beitragvon HaWe » 23. Feb 2016 21:42

(analog) Potentiometer-Joystick für Differentialantriebs-Steuerung

Quelle: http://electronics.stackexchange.com/qu ... otor-drive

Code, um mit einem Potentiometer-Joystick (2 im 90° Winkel übereinandergesetzte Potis) Roboter mit Differentialantrieb ("Tribot", "Panzer") zu steuern, wobei bei vollem Seiten-Ausschlag beide Räder/Ketten un entgegengesetzte Richtung drehen (=> drehen auf der Stelle).

Bild
Bild


Code: Alles auswählen

// program Joystick tank-control
//
// ver 0001

// Atmega328p (UNO) based Arduino code,
// tested on:
// - RBBB Arduino clone by Modern Device
// - also works for Arduino Due Clone (ARM Cortex M3, 3.3V reference voltage)

const byte joysticYA = A0; //Analog Jostick Y axis
const byte joysticXA = A1; //Analog Jostick X axis

const byte controllerFA = 10; //PWM FORWARD PIN for OSMC Controller A (left motor)
const byte controllerRA = 9;  //PWM REVERSE PIN for OSMC Controller A (left motor)
const byte controllerFB = 6;  //PWM FORWARD PIN for OSMC Controller B (right motor)
const byte controllerRB = 5;  //PWM REVERSE PIN for OSMC Controller B (right motor)
const byte disablePin = 2; //OSMC disable, pull LOW to enable motor controller

int analogTmp = 0; //temporary variable to store
int throttle, direction = 0; //throttle (Y axis) and direction (X axis)

int leftMotor,leftMotorScaled = 0, oldleftMotorScaled; //left Motor helper variables
float leftMotorScale = 0;

int rightMotor,rightMotorScaled = 0, oldrightMotorScaled; //right Motor helper variables
float rightMotorScale = 0;

float maxMotorScale = 0; //holds the mixed output scaling factor

int deadZone = 10; //jostick dead zone

void setup()  {

  //initialization of pins 
  Serial.begin(115200);
 
  pinMode(controllerFA, OUTPUT);
  pinMode(controllerRA, OUTPUT);
  pinMode(controllerFB, OUTPUT);
  pinMode(controllerRB, OUTPUT); 

  pinMode(disablePin, OUTPUT);
  digitalWrite(disablePin, LOW);

  oldleftMotorScaled  = 0;
  oldrightMotorScaled = 0;
}

void loop()  {
  //aquire the analog input for Y  and rescale the 0..1023 range to -255..255 range
  analogTmp = analogRead(joysticYA);
  throttle = (512-analogTmp)/2;

  delayMicroseconds(100);
  //...and  the same for X axis
  analogTmp = analogRead(joysticXA);
  direction = -(512-analogTmp)/2;

  //mix throttle and direction
  leftMotor  = throttle + direction;
  rightMotor = throttle - direction;

  //print the initial mix results
  Serial.print("LIN:");   Serial.print( leftMotor, DEC);
  Serial.print(", RIN:"); Serial.print( rightMotor, DEC);

  //calculate the scale of the results in comparision base 8 bit PWM resolution
  leftMotorScale =  leftMotor/255.0;
  leftMotorScale = abs(leftMotorScale);
  rightMotorScale =  rightMotor/255.0;
  rightMotorScale = abs(rightMotorScale);

  Serial.print("| LSCALE:"); Serial.print( leftMotorScale,2);
  Serial.print(", RSCALE:"); Serial.print( rightMotorScale,2);

  //choose the max scale value if it is above 1
  maxMotorScale = max(leftMotorScale,rightMotorScale);
  maxMotorScale = max(1,maxMotorScale);

  //and apply it to the mixed values
  leftMotorScaled  = constrain(leftMotor/maxMotorScale,-255,255);
  rightMotorScaled = constrain(rightMotor/maxMotorScale,-255,255);

  // apply low-pass filter;
  leftMotorScaled  = 0.9*leftMotorScaled  + 0.1*oldleftMotorScaled;
  rightMotorScaled = 0.9*rightMotorScaled + 0.1*oldrightMotorScaled;

  Serial.print("| LOUT:"); Serial.print( leftMotorScaled);
  Serial.print(", ROUT:"); Serial.print( rightMotorScaled);

  oldleftMotorScaled  = leftMotorScaled;
  oldrightMotorScaled = rightMotorScaled;

  Serial.print(" |");

  //apply the results to appropriate uC PWM outputs for the LEFT motor:
  if(abs(leftMotorScaled)>deadZone)
  {

    if (leftMotorScaled > 0)
    {
      Serial.print("F");
      Serial.print(abs(leftMotorScaled),DEC);

      analogWrite(controllerRA,0);
      analogWrite(controllerFA,abs(leftMotorScaled));           
    }
    else
    {
      Serial.print("R");
      Serial.print(abs(leftMotorScaled),DEC);

      analogWrite(controllerFA,0);
      analogWrite(controllerRA,abs(leftMotorScaled)); 
    }
  } 
  else
  {
  Serial.print("IDLE");
  analogWrite(controllerFA,0);
  analogWrite(controllerRA,0);
  }

  //apply the results to appropriate uC PWM outputs for the RIGHT motor: 
  if(abs(rightMotorScaled)>deadZone)
  {

    if (rightMotorScaled > 0)
    {
      Serial.print("F");
      Serial.print(abs(rightMotorScaled),DEC);

      analogWrite(controllerRB,0);
      analogWrite(controllerFB,abs(rightMotorScaled));           
    }
    else
    {
      Serial.print("R");
      Serial.print(abs(rightMotorScaled),DEC);

      analogWrite(controllerFB,0);
      analogWrite(controllerRB,abs(rightMotorScaled)); 
    }
  } 
  else
  {
  Serial.print("IDLE");
  analogWrite(controllerFB,0);
  analogWrite(controllerRB,0);
  }

  Serial.println("");

  //To do: throttle change limiting, to avoid radical changes of direction for large DC motors

  delay(10);

}

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5256
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Re: Arduino Driver libraries (Baustelle): Displays, SD, I2C, UART,...

Beitragvon HaWe » 24. Feb 2016 15:23

Platzhalter


Zurück zu „allgemeine / Nicht-Lego-Robotik und Elektronik“

Wer ist online?

Mitglieder in diesem Forum: TheCritter und 10 Gäste

Lego Mindstorms EV3, NXT und RCX Forum : Haftungsauschluss