Mittwoch, 1. Mai 2013

Servo mit Fernbedienung - Quellcode

Hier der Quellcode zur Ansteuerung des Servos mit der AIWA-Fernbedienung:
#define LED_unten 7
#define LED_oben 6
#define IR36Khz 5 // TSOP 31236
#define laenge 48
#define time 100000

#include <Servo.h>
Servo meinServo; 
int muster[laenge];
int i = 0;
int Servofaktor = 1;
int taktPin = 8;     // SH_CP
int speicherPin = 11; // ST_CP
int datenPin = 10;   // DS

void setup() {
  pinMode(taktPin, OUTPUT);
  pinMode(speicherPin, OUTPUT);
  pinMode(datenPin, OUTPUT);
  pinMode(LED_unten, OUTPUT);
  pinMode(LED_oben, OUTPUT);
  pinMode(IR36Khz, INPUT); 
  digitalWrite(LED_unten, LOW);
  digitalWrite(LED_oben, LOW); 
  meinServo.attach(9); // Objekt mit Pin 9 verbinden
 // Serial.begin(9600);
  setLEDs(B00000001);
}

void loop() {
  readRemote(pulseIn(IR36Khz, HIGH, time));   
}

void readRemote(int pulse1) {
    i = 0; 
    if (pulse1 > 4000) {  
    
    boolean pressed = true;
    int highpulse = pulseIn(IR36Khz, HIGH, time);
    while ((highpulse < 4000) &&  (highpulse > 100)){
      if (highpulse > 1000) {
        muster[i++] = 1;
      } else {
        muster[i++] = 0;
      }
      highpulse = pulseIn(IR36Khz, HIGH, time);  
    }
    
    for (i; i < laenge; i++) muster[i] = -1;
    
    while (pressed){
      getButton();
      pressed = (highpulse > 20000) & (pulseIn(IR36Khz, HIGH, time) > 4000);
    }
    
  digitalWrite(LED_unten, LOW);
  digitalWrite(LED_oben, LOW); 
  }  
}

void getButton(){
  unsigned int a = 0;
  unsigned int b = 0;
  unsigned int c = 0;
  
  for (int i = 0; i < 16; i++) {
    if (muster[i] == 1) a = a + (1 << i);
    if (muster[i+16] == 1) b = b + (1 << i);
    if (muster[i+32] == 1) c = c + (1 << i);
  }
  
  if (a == 57464 && b == 19440 && c == 948) { // Pfeil unten
    downArrow();
  } else if (a == 57464 && b == 18416 && c == 952) { // Pfeil oben
    upArrow();
  } else if (a == 49273 && b == 17392 && c == 956) { // Down Button
    downButton(); 
  } else if (a == 49273 && b == 16368 && c == 960) { // Up Button
    upButton(); 
  } else {
 //   Serial.println(a);
  //  Serial.println(b);
  //  Serial.println(c);
  }
}

void upButton() 
{
  if (Servofaktor < 15) Servofaktor ++;  
  digitalWrite(LED_oben, HIGH);
  aktualisiereLED();
}

void downButton() 
{
  if (Servofaktor > 2) Servofaktor --; 
  digitalWrite(LED_unten, HIGH); 
  aktualisiereLED();
}

void aktualisiereLED()
{
  switch (Servofaktor) 
  {
    case 1: setLEDs(B00000001); break;
    case 2: setLEDs(B00000001); break;
    case 3: setLEDs(B00000011); break;
    case 4: setLEDs(B00000011); break;
    case 5: setLEDs(B00000111); break;
    case 6: setLEDs(B00000111); break;
    case 7: setLEDs(B00001111); break;
    case 8: setLEDs(B00001111); break;
    case 9: setLEDs(B00011111); break;
    case 10: setLEDs(B00011111); break;
    case 11: setLEDs(B00111111); break;
    case 12: setLEDs(B00111111); break;
    case 13: setLEDs(B01111111); break;
    case 14: setLEDs(B01111111); break;
    case 15: setLEDs(B11111111); break;
    case 16: setLEDs(B11111111); break;
  }
}

void setLEDs(byte bitmuster) {
  digitalWrite(speicherPin, LOW);
  shiftOut(datenPin, taktPin, LSBFIRST, bitmuster);
  digitalWrite(speicherPin, HIGH);
}

void upArrow() 
{
  if (Servoposition > 2) 
  {
    Servoposition = Servoposition - Servofaktor;
    if (Servoposition < 1) Servoposition = 1;
    meinServo.write(Servoposition);
    //delay(20);
  }  
  digitalWrite(LED_oben, HIGH);
}

void downArrow() 
{
  if (Servoposition < 180) 
  {
    Servoposition = Servoposition + Servofaktor;
    if (Servoposition > 180) Servoposition = 180;
    meinServo.write(Servoposition);
   // delay(20);
  }  
  digitalWrite(LED_unten, HIGH);
}
Hier der Quellcode:

Dienstag, 30. April 2013

Servo mit Fernbedienung

Nach längerem Herumprobieren habe ich es nun geschafft, eine alte Fernbedienung zu "decodieren". So wie es in einigen Tutorials beschrieben wurde, hats bei mir nicht funktioniert. Aber jetzt läuft es. Vielleicht werde ich den Sketch für die Fernbedienung auch noch hier posten. Verwendet wurde ein TSOP IR-Empfänger. Mit der Fernbedienung steuere ich einen Servo an, wobei man auch dessen Geschwindigkeit anpassen kann. Auf den Servo habe ich eine Platine mit 8 grünen LEDs gepackt, die mit einem 74HC595 angesteuert werden. Diese zeigen die gewählte Geschwindikeit. Die Löterei hat mal wieder etwas Zeit in Anspruch genommen. Hier ein paar Bilder und ein Video:

Freitag, 12. April 2013

Erste Lötarbeiten mit RGB-LED

Nach anfänglichen Schwierigkeiten habe ich meine erste kleine Platine gelötet, auf der eine RGB-LED montiert ist. Ist gar nicht sooo einfach, aber es wird.

Montag, 18. März 2013

Es macht Spaß

Mittlerweile habe ich ein paar Projekte aus dem Buch von Erik Bartmann nachgebaut und die Zusammenhänge werden klar. Die Programmierung ist (bis jetzt) noch sehr simpel. Anbei ein Bildchen von der 2fachen Porterweiterung. Da kommen schon einige Drähtchen auch dem Steckbrett zusammen!

Als nächstes werde ich mir einen Beschleunigungssensor kaufen. Wahrscheinlich diesen hier:
MPU6050

Montag, 11. März 2013

Löten und Litze

Am Wochenende habe ich mir erst einmal einen Lötkolben und Material gekauft. Der Arduino ist jetzt mit Steckbrett auf einem Holzbrett verschraubt. Jetzt kann es richtig losgehen.
Zuerst mal ein paar Steckverbindungen gelötet. Dann ein Potentiometer und den 9V-Adapter angelötet. Noch dauert es etwas lange, aber Übung macht bekanntlich den Meister. Eine helfende Hand benötige ich noch.

Das Addon für Eclipse habe ich auch schon installiert, allerdings habe ich darüber noch keinen Sketch auf den Arduino übertragen.

Freitag, 8. März 2013

Der Taster

Gestern erfolgreich eine Schaltung mit Taster und Pulldown-Widerstand erstellt. Mach echt Spaß, der kleine Arduino.
Leider habe ich festgestellt, dass die Sicherung in meinem Multimeter durch ist. Da muss ich irgendwann mal Mist mit gebaut haben. Also erst mal ne ne Neue kaufen.

Donnerstag, 7. März 2013

Arduino LEDs

Gestern ist das Päckchen endlich angekommen.
Nach dem Installieren des Treibers und der Software habe ich dann drei LEDs ans Leuchten bekommen: