zaterdag 7 april 2012

Cybot Aduino en andere electronica


---Zie ook HTTP://CYBOTTOM.TK---- alles over de Cubot en Tom.

Dankzij een schenking ben ik in het bezit van 2 Cybots en 2 Tom's (het broertje van cybot) gekomen.
Nu is mijn plan om van elk 1 standaard volledig op te bouwen en van elk 1 te voorzien van een Arduino zodat ik alles zelf kan aansturen.
Met Botje (de 1e cybot) gaat het al redelijk de goede kant op alhoewel ik wel merk dat de originele schema's hier en daar wat afwijken van de werkelijkheid. Zo klopt de voeding niet helemaal met de print en is de processor print ook niet helemaal correct. Die schema´s zal ik ook eens uitwerken en publicereen.

Met ArduinoBot is het wat lastiger. Die is alleen nog theoretisch omdat ik nog niet precies weet hoe en wat ik gebruik van de Cybot en wat ik zelf ga aansturen met de Arduino.
Vrijwel alles is makkelijk aan te sturen maar met de bestaande sonar van de cybot is dat wat lastiger. Nu vond ik op www.mstracey.btinternet.co.uk/interest.htm heel veel informatie en bij www.cybench.co.uk/cybot/sonar.php nog details maar dan nog lukt het me niet om de Arduino te laten communiceren met de EM78P156E processor van de Cybot.
Is er iemand die het gelukt is om via de I2C met een Arduino te communiceren met Cybot van Ultimate Real? Ik twijfel want na veel dagen zoeken op internet zie ik veel theoretische verhalen dat het moet lukken maar niet dat het gelukt is. Inmiddels heb ik goede scoop en ga ik binnenkort wel eens verder zoeken.

    Omdat de modelbouwafdeling van de NZHHobbyclub opnieuw ingedeeld moest worden werd mijn weblog gestoord. Sorry.
   Inmiddels ben ik een zijweg ingeslagen. Via de Arduino en I2C dingen aansturen en inlezen. Waarom via de I2C? Ik kan dan vrijwel onbeperkt dingen aansluiten.  Inmiddels heb ik een stappenmoter aangesloten die ik door een joystick kan aansturen. Middenstand is stop langzaam vooruit en versnellen, langzaam achteruit en versnellen. Het schema moet ik met Eagle nog maken maar het is meer softwarematig regelen dan hardware.
   Dat I2C is ook gekomen omdat ik de sonar niet aan de gang kreeg en ik via Ebay een I2C sonor kon kopen voor $3,00. Belachelijk goedkoop. Eens kijken of ik die op een stappenmotor kan bevestigen en dat geheel kan gebruiken als een soort radar. 
  
   De Arduino bot zal dus vermoedelijk met I2C aangestuurd worden en inplaats van de Arduino de Jeenode. Ik heb wat geexperimenteerd om de Jlink af teluisteren op de gesimuleerde RS232 USB poort en dat lukt. Theoretisch kan je dan met je PC de Cybot besturen. Eerst eens kijken of ik de sonar in de PC kan aflezen.
  Ook zal ik binnenkort eens wat foto´s-schema´s en sketches van de arduino plaatsen. Verwacht hier verder geen lessen voor Arduino want die vind je overal op het internet. Zoek eens op lessen arduino of arduino les etc.
 
   I2C dus, ik ben even aan het spelen geweest en heb 3 stappenmotoren via de I2C aan het draaien via de Arduino.
   De Arduino stuurt signalen naar het IC MCP23017. 16 in/uitgangen die ook in 2 registers van 8 te gebruiken zijn of zoals door mij elk register in 2x 4.
  Een ander IC, de PCF8519 leest ook via de I2C 4x analoog in en stuurt in stapjes 1x analoog uit.
  Nu lees ik via de PCF8519, 4 variabele weerstanden van b.v. 10kOhm uit.
  De eerste 2 weerstanden gebruik ik vanaf de middenstand. De middenstand bepaald de ruststand van de stappenmotor. Vermindering van de weerstand is de ene kant om en verhoging is de andere kant om draaien. Afhankelijk van de uitsturing gaat de motor sneller draaien.

   Waarom dit verhaal? Nou, ik krijg de sonor van de Cybot en zijn broertje Tom niet leesbaar op de Arduino. Ik probeer nu een goedkope sonor uit China te plakken op een stappenmotor en zo een soort werkende radar te maken. Tom het broertje van de Cybot heeft ook zo iets.
  En misschien is er iemand die iets aan die experimenten van mij heeft.

  De sonar die ik uit China ontving voor 3 euro doet het. Ik had het in drie minuten draaiend inclusief het uitpakken. Mijn PC stond al aan en de software voor de sonar had ik al op het internet gevonden. Ik was wel verbaast dat ik libriaries vond voor de Arduino en die niet nodig had voor Arduino 23. Binnenkort eens kijken voor Arduino 1 software die toch regelmatig iets anders is.

  Op http://trollmaker.com/article3/arduino-and-hc-sr04-ultrasonic-sensor/ kwam ik een heel mooi sketch tegen die meteen werkte bij Arduino 23 zonder librari.

/*
 HC-SR04 Ping distance sensor]
 VCC to arduino 5v GND to arduino GND
 Echo to Arduino pin 13 Trig to Arduino pin 12
 More info at: http://goo.gl/kJ8Gl
 */

#define trigPin 12
#define echoPin 13

void setup() {
  Serial.begin (9600);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
}

void loop() {
  int duration, distance;
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(1000);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  distance = (duration/2) / 29.1;
  if (distance >= 200 || distance <= 0){
    Serial.println("Out of range");
  }
  else {
    Serial.print(distance);
    Serial.println(" cm");
  }
  delay(500);
}
 
De vraag is dus, kan I2C die sonar ook benaderen. Daar heb ik het 2e MCP23017 IC voor nodig.
  
Nu ik toch met sketches van de Arduino bezig ben kan ik meteen de sketch tonen voor de benadering van de 3 IC's.
 
#include           // Wire library t.b.v. I²C

// adressering
#define A_I2Cadres 0x22    // IC 1 2x 8 bits out
#define B_I2Cadres 0x21    // IC 2 2x 8 bits in 
#define C_I2Cin 0x90>>1    // naar analog lezen 4x in  
#define C_I2Cout 0x91>>1   // naar analog schrijven 1x out 

Omdat Arduino 7 bits over I2C stuurt moet het 8e bit voor de adressering in het IC geschoven worden. Vandaar de >>
Dat is alleen nodig bij de PCF8519.  Elk IC heeft een eigen niet te veranderen hardware adres en een wel te veranderen adresdeel. Zo heeft de PCF8519 de 4x en de MCP 2x.

// MCP23017 registers (everything except direction defaults to 0)
#define IODIRA   0x00           // IO direction  (0 = output, 1 = input (Default))
#define IODIRB   0x01
#define IOPOLA   0x02           // IO polarity   (0 = normal, 1 = inverse)
#define IOPOLB   0x03
#define GPINTENA 0x04           // Interrupt on change (0 = disable, 1 = enable)
#define GPINTENB 0x05           //
#define DEFVALA  0x06           // Default comparison for interrupt on change (interrupts on opposite)
#define DEFVALB  0x07
#define INTCONA  0x08           // Interrupt control (0 = interrupt on change from previous, 1 = interrupt on change from DEFVAL)
#define INTCONB  0x09
#define IOCON    0x0A           // IO Configuration: bank/mirror/seqop/disslw/haen/odr/intpol/notimp
//#define IOCON 0x0B            // same as 0x0A
#define GPPUA    0x0C           // Pull-up resistor (0 = disabled, 1 = enabled)
#define GPPUB    0x0D
#define INFTFA   0x0E           // Interrupt flag (read only) : (0 = no interrupt, 1 = pin caused interrupt)
#define INFTFB   0x0F
#define INTCAPA  0x10           // Interrupt capture (read only) : value of GPIO at time of last interrupt
#define INTCAPB  0x11
#define GPIOA    0x12           // Port value. Write to change, read to obtain value
#define GPIOB    0x13
#define OLLATA   0x14           // Output latch. Write to latch output.
#define OLLATB   0x15
Nu heb je vast niet alle instellingen voor de MCP nodig maar als je experimenteert zoals ik is het handig om alle mogelijkheden te definiƫren.

//   setup PCF 8591
#define C_I2C_A 0x01
#define C_I2C_B 0x02
#define C_I2C_C 0x03
#define C_I2C_D 0x04
#define C_I2C_uit 0x40        // data uitsturen

Dat is veel makkelijker.

// stappenmotor snelheid/vertraging
int st1;
int st2;
int st3;
int st4;

Elke motor kan je zo zijn eigen snelheid instellen door vertraging te geven.

//IC 3
//  output waarden
int IC3_out;
//  input waarden
int IC3_1;  //M1 regeling             
int IC3_2;  //M2 regeling  
int IC3_3;  //M3 regeling                 
int IC3_4;  //M4 regeling

IC3 gebruik ik om potmeters af te lezen.

//IC2
int IC2_A;
int IC2_B;
//IC1 2x stappenmotor per register
int IC1_A1; //M1
int IC1_A2; //M2
int IC1_B1; //M3
int IC1_B2; //M4

IC2 om dingen aan te sturen, in dit geval register A 2 stappen motoren en register B 1 stappen motor.

// stappen definiƫren
int stappen;
int stappen1[]={0x0A,0x08,0x09,0x01,0x05,0x04,0x06};
int stappen2[]={0xA0,0x80,0x90,0x10,0x50,0x40,0x60};
int stappen3[]={0xA0,0x80,0x90,0x10,0x50,0x40,0x60};

Voor elke motor een definitie. Kan anders maar voor mij was dit het makkelijkste.

//  LCD
#include
LiquidCrystal lcd(12,11,10,7,6,5,4);


Het LCD aansluiten op de Arduino. 4 regels 16 karakters. Via I2C moet ik nog eens proberen.

void setup()
{
    //

  //
  Serial.begin(57600);
  // 4 row 16 characters diplay
  lcd.begin(16, 4);
  lcd.setCursor(0,0);
  lcd.print("Test opstelling.");
  lcd.setCursor(0,1);
  lcd.print("2x MCP23o17");
  lcd.setCursor(-4,2);
  lcd.print("en "); 
  lcd.setCursor(-4,3);
  lcd.print("1x PCF8591");
  delay(500);                   // show


Het eerste deel laat zien dat de setup is begonnen.
1e IC instellen.
// 1e IC 
  Wire.begin();                                        // start Wire library met adres
  Wire.beginTransmission(A_I2Cadres);                  // I²C Adres chip
  Wire.send(IOCON);                                    // IOCON register 
  Wire.send(0x20);                                     // Disable sequential addresses
  Wire.endTransmission();
  //
  LCDClear();
  //
  lcd.setCursor(0,0);
  lcd.print("Setup MCPA 1");
  lcd.setCursor(0,7);
  lcd.print(A_I2Cadres);
  lcd.setCursor(0,1);
  lcd.print("IOCON");
  lcd.setCursor(7,1);
  lcd.print(IOCON);

  Wire.beginTransmission(A_I2Cadres);
  Wire.send(IODIRA);                                         // IODIRA register
  Wire.send(0x00);                                           // All 0, all out
  Wire.endTransmission();
  lcd.setCursor(-4,2);
  lcd.print("IODIRA");
  lcd.setCursor(3,2);
  lcd.print(IODIRA);
 
  Wire.beginTransmission(A_I2Cadres);
  Wire.send(IODIRB);                                         // IODIRB register
  Wire.send(0x00);                                           //
  Wire.endTransmission();
  lcd.setCursor(-4,3);
  lcd.print("IODIRB");
  lcd.setCursor(3,3);
  lcd.print(IODIRB);
  delay(500);
 

  lcd.setCursor(0,0);
  lcd.print("Setup MCPA 1");
  lcd.setCursor(0,7);
  lcd.print(A_I2Cadres);
  LCDClear();