Werklamp van de Action: Met MORSE-code herkenning

Toon hier Uw afgeronde projecten aan anderen.
Gebruikers-avatar
Berichten: 700
Geregistreerd: 05 Mrt 2012, 21:56
Woonplaats: Appingedam

Werklamp van de Action: Met MORSE-code herkenning

Berichtdoor pjh » 14 Okt 2012, 19:00

Eerder kreeg ik een PIR sensor uit een “Nachtlampje” van de Action (winkel) aangesloten op een Arduino. Ditmaal vond ik een zaklamp met een 3 x 8 LED array erin. Ik heb deze gemultiplext en verbonden met een ATMega328 “Arduino” via een shiftregister op de 8 anodes en 3 keert een 2N2222 transistor op de kathodes. Er zit een magneet op deze zaklamp, die aan de binnenkant ook bloot ligt. Met een grote weerstand heb ik er capacitive touch functie aan toegevoegd. Ik heb de software zo geschreven dat de magneet reageert op morsecode. Dus kort aanraken is een “punt” en lang aanraken is een “streep”. Wat je op de magneet “inseint” komt op de display getoond. Ik kreeg een ATMega8 niet snelgenoeg aan de praat, maar de hele sketch pas ook daar op. Ik heb het resultaat in een youtube filmpje gezet [hier: http://youtu.be/DpKHMUzXYfE ] en de “bouwtekening” staat hieronder. Sketch op het einde.

NB: Er is nogal wat interferentie op de lijn. LEDjes gaan onbedoeld toch een beetje aan. Ik heb hier niet veel aandacht aan geschonken, omdat ik er te veel tijd mee kwijt ben. Zo is het goed en kan het de kast in.

*****
** UPDATE: EEN x AANTAL berichten verder STAAT ER EEN SCHEMA DIE WEL KLOPT. Ik heb nl. de cathode en anodes omgedraaid. EXCUUS & Dank aan RUDI !! :P :D
*****


Afbeelding

Code: Alles selecteren
#include <CapSense.h>
CapSense   cs_4_2 = CapSense(12,13);

int cat = 0;
int dataPin  = 6; // HC595-3
int clockPin  = 8; // HC595-1, 2 & 3
int latchPin  = 7; // HC595-1, 2 & 37
//int c[] = {9, 10, 11};
int c[] = {
  9, 11, 10};
unsigned long teller;

int cijfer[] ={
  0x00,0x00,0x00,
  0x00,0x00,0x00,
  0x00,0x00,0x00,
  0x00,0x00,0x00,
  0x00,0x00,0x00,
  0x00,0x00,0x00,
  0x00,0x00,0x00,
  0x00,0x00,0x00,
  0x00,0x00,0x00,
  0x00,0x00,0x00,

  0x00,0x00,0x00,
  0x00,0x00,0x00,
  0x00,0x00,0x00,
  0x00,0x00,0x00,
  0x00,0x00,0x00,
  0x00,0x00,0x00,
  0x00,0x00,0x00,
  0x00,0x00,0x00,
  0x00,0x00,0x00,
  0x00,0x00,0x00,

  0x00,0x00,0x00,
  0x00,0x00,0x00,
  0x00,0x00,0x00,
  0x00,0x00,0x00,
  0x00,0x00,0x00,
  0x00,0x00,0x00,
  0x00,0x00,0x00,
  0x00,0x00,0x00,
  0x00,0x00,0x00,
  0x00,0x00,0x00,

  0x24, 0x40, 0x24,
  0xDB, 0xBF, 0xDB,
  0x1C, 0x38, 0x1C,
  0x10, 0x38, 0x10,
  0x00, 0x00, 0x00,
  0x00, 0x00, 0x00,
  0x10, 0x38, 0x10,
  0xE7, 0xC3, 0xE7,
  0x7E, 0x81, 0x7E,
  0x81, 0x7E, 0x81,
  0x00, 0x00, 0x00,
  0x00, 0x00, 0x00,
  0x00, 0x00, 0x00,
  0x00, 0x00, 0x00,
  0x00, 0x00, 0x00,
  0x60, 0x78, 0x60,
  0x06, 0x1E, 0x06,
  0x00, 0x00, 0x00,
  0x5F, 0x00, 0x5F,
  0x00, 0x00, 0x00,
  0x00, 0x00, 0x00,
  0x00, 0x7E, 0x7E,
  0x00, 0x00, 0x00,
  0x00, 0x00, 0x00,
  0x00, 0x20, 0x7F,
  0x02, 0xFF, 0x02,
  0x40, 0xFF, 0x40,
  0xC0, 0xC0, 0xFF,
  0x66, 0xFF, 0x66,
  0x10, 0x38, 0xFE,
  0xFE, 0x38, 0x10,
  0x00, 0x00, 0x00,
  0x00, 0x5F, 0x00,
  0x03, 0x00, 0x03,
  0x7F, 0x14, 0x7F,
  0xFF, 0x89, 0xCB,
  0x32, 0x08, 0x26,
  0x73, 0x4D, 0x25,
  0x04, 0x03, 0x00,
  0x1C, 0x22, 0x41,
  0x41, 0x22, 0x1C,
  0x2A, 0x1C, 0x2A,
  0x08, 0x1C, 0x08,
  0x80, 0x40, 0x00,
  0x08, 0x08, 0x08,
  0x00, 0x40, 0x00,
  0x60, 0x1C, 0x03,
  0x3C, 0x42, 0x3C,
  0x44, 0x7E, 0x40,
  0x64, 0x52, 0x4C,
  0x42, 0x4A, 0x34,
  0x1E, 0x10, 0x7C,
  0x4E, 0x4A, 0x32,
  0x3C, 0x4A, 0x32,
  0x02, 0x72, 0x0E,
  0x34, 0x4A, 0x34,
  0x4C, 0x52, 0x3C,
  0x00, 0x22, 0x00,
  0x40, 0x22, 0x00,
  0x08, 0x14, 0x22,
  0x14, 0x14, 0x14,
  0x22, 0x14, 0x08,
  0x06, 0x51, 0x0E,
  0x76, 0x52, 0x7E,
  0x7C, 0x12, 0x7C,
  0x7E, 0x4A, 0x34,
  0x3C, 0x42, 0x42,
  0x7E, 0x42, 0x3C,
  0x7E, 0x4A, 0x42,
  0x7E, 0x0A, 0x02,
  0x3C, 0x42, 0x32,
  0x7E, 0x08, 0x7E,
  0x42, 0x7E, 0x42,
  0x20, 0x40, 0x3E,
  0x7E, 0x18, 0x66,
  0x7E, 0x40, 0x40,
  0x7E, 0x1C, 0x7E,
  0x7E, 0x04, 0x7E,
  0x3C, 0x42, 0x3C,
  0x7E, 0x12, 0x0C,
  0x3C, 0x42, 0xFC,
  0x7C, 0x02, 0x02,
  0x4C, 0x4A, 0x3A,
  0x02, 0x7E, 0x02,
  0x7E, 0x40, 0x7E,
  0x1E, 0x20, 0x7E,
  0x7E, 0x30, 0x7E,
  0x66, 0x18, 0x66,
  0x0E, 0x70, 0x0E,
  0x62, 0x5A, 0x46,
  0x00, 0x7F, 0x41,
  0x03, 0x1C, 0x60,
  0x41, 0x41, 0x7F,
  0x30, 0x08, 0x30,
  0x00, 0x00, 0x00,
  0x10, 0x10, 0x00
};

int graph[] = {
  0x81, 0x00, 0x81, 0x42, 0x00, 0x42, 0x24, 0x00, 0x24, 0x18, 0x00, 0x18,  0x18, 0x18, 0x18, 0x18, 0x3C, 0x18,
  0x24, 0x5A, 0x24, 0x7E, 0x81, 0x7E, 0x66, 0x99, 0x66, 0x42, 0xA5, 0x42,  0x42, 0xE7, 0x42,   0x81, 0xC3, 0x81,
  0x42, 0x81, 0x42, 0x24, 0x81, 0x24, 0x42, 0x00, 0x42, 0x81, 0x00, 0x81 };

unsigned int morseAscii[]={
  2045, 39, 503, 40, 3575, 41, 3935, 44, 3415, 45, 3549, 46, 471, 47, 1023, 48, 1021, 49, 1013, 50, 981, 51, 853, 52, 341, 53, 343, 54, 351, 55, 383, 56, 511, 57, 1407, 58, 887, 59, 855, 61, 1525, 63, 1917, 64, 13, 65, 87, 66, 119, 67, 23, 68, 1, 69, 117, 70, 31, 71, 85, 72, 5, 73, 253, 74, 55, 75, 93, 76, 15, 77, 7, 78, 63, 79, 125, 80, 223, 81, 29, 82, 21, 83, 3, 84, 53, 85, 213, 86, 61, 87, 215, 88, 247, 89, 95, 90, 3415, 45,};

unsigned long alaan=0;
unsigned long tijdBegin;
unsigned long tijdNul;
int k=0;
unsigned int bitPos=0x00;
unsigned int morseLees=0x00;
unsigned int TOON=0x01;
unsigned int klkl=0x01;
boolean kh=0;
int asciiOut = 65;
int cc=0;

void setup(){

  cs_4_2.set_CS_AutocaL_Millis(0xFFFFFFFF);     // turn off autocalibrate on channel 1 - just as an example

  for (int i = 0; i < 3; i++){
    pinMode(c[i], OUTPUT);
    digitalWrite(c[i], LOW);
  }

  Serial.begin(9600);
  pinMode(dataPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(latchPin, OUTPUT);

  tijdNul = millis();

}

void loop(){
  digitalWrite(c[cc], HIGH);
  if (cat > 333){
    cat=0;
    long total =  cs_4_2.capSense(30);
    if (total > 10){
      tijdNul = millis();
      if (alaan>0){
        alaan++;
      }
      else {
        alaan=1;
        tijdBegin = millis();
      }
    }
    else{
      if (alaan>0){
        unsigned long tijdsverschil = millis()-tijdBegin;
        if (tijdsverschil >2000){
          Serial.print("heel lang  -  ");
          demo();
        }
        else{
          if (tijdsverschil >180){
            Serial.print("lang  -  ");
            morseLees |= (3 << bitPos);
            kh=1;
          }
          else{
            Serial.print("kort  -  ");
            morseLees |= (1 << bitPos);
            kh=1;
          }
          bitPos+=2;
        }
        klkl=morseLees;
        Serial.println(tijdsverschil);
        alaan=0;
      }
      else{
        if ((kh)&(millis() - tijdNul > 3000)){
          tijdNul=millis();
          kh=0;
          klkl=morseLees;
          for (int i=0;i< 49;i++){
            if (morseAscii[i*2] == klkl){
              asciiOut = morseAscii[i*2+1]+29;
              Serial.println(asciiOut);
              break;
            }
          }
          morseLees=0;
          bitPos = 0;
        }
      }
    }
  }
  shiftIt(cijfer[asciiOut*3+cc]);
  digitalWrite(c[cc], LOW);
  cat++;
  cc=cat%3;

}
void demo(){
  for (int keer =0;keer < 10; keer++){
    for (int frame = 0; frame < 16; frame++){
      for (int tijd = 0; tijd < 1200/(keer*4); tijd++){
        for (int j =0; j < 3; j++){
          digitalWrite(c[j], HIGH);
          shiftIt(graph[frame*3+j]);
          digitalWrite(c[j], LOW);
        }
      }
    }
  }

  int a[] = {
    0x00, 0x00, 0x00  };
  for (int lampje = 0; lampje < 24; lampje++){
    a[lampje%3] = a[lampje%3] | (1 << (lampje/3));
    for (int tijd = 0; tijd < 300; tijd++){
      for (int j =0; j < 3; j++){
        digitalWrite(c[j], HIGH);
        shiftIt(a[j]);
        digitalWrite(c[j], LOW);
      }
    }
  }
  for (int lampje = 0; lampje < 24; lampje++){
    a[lampje%3] = a[lampje%3] & (0xFF- (1 << (lampje/3)));
    for (int tijd = 0; tijd < 100; tijd++){
      for (int j =0; j < 3; j++){
        digitalWrite(c[j], HIGH);
        shiftIt(a[j]);
        digitalWrite(c[j], LOW);
      }
    }
  }

  int b[] = {
    0x00, 0x00, 0x00  };
  for (int lampje = 0; lampje < 24; lampje++){
    b[lampje%3] = b[lampje%3] | (1 << (lampje/3));
    for (int tijd = 0; tijd < (700/lampje); tijd++){
      for (int j =0; j < 3; j++){
        digitalWrite(c[j], HIGH);
        shiftIt(b[j]);
        digitalWrite(c[j], LOW);
      }
    }
  }


  for (int  cijf= 0; cijf < 255; cijf++){

    for (int j =0; j < 3; j++){
      for (int tijd = 0; tijd < 50; tijd++){
        digitalWrite(c[j], HIGH);
        shiftIt(cijf+j);
        digitalWrite(c[j], LOW);
      }
    }
  }
  for (int  tt= 0; tt < 10; tt++){
    for (int  cijf= 0; cijf < 253; cijf++){
      for (int j =0; j < 3; j++){
        digitalWrite(c[j], HIGH);
        shiftIt(cijf+j);
        digitalWrite(c[j], LOW);
      }
    }
  }
  for (int cijf = 48; cijf < 97; cijf++){
    for (int tijd = 0; tijd < 700; tijd++){
      for (int j =0; j < 3; j++){
        digitalWrite(c[j], HIGH);
        shiftIt(cijfer[cijf*3+j]);
        digitalWrite(c[j], LOW);
      }
    }
  }
 int time = millis();
   while( millis()-time < 3000){
   teller++;
   int x = (1.5 + 1.5*sin(teller/(log(teller))));
   for (int t=0; t< 30; t++){
   digitalWrite(c[x], HIGH);
   shiftIt(1 <<(teller%8));
   digitalWrite(c[x], LOW);
   }
   }
}

void shiftIt (byte b1){         
  digitalWrite(latchPin, HIGH);
  for (int k=0; k < 8; k++){
    digitalWrite(clockPin, LOW);
    if ( b1 & (0X80 >> k) ){
      digitalWrite(dataPin, LOW);
    }
    else{
      digitalWrite(dataPin, HIGH);
    }
    digitalWrite(clockPin, HIGH);
  }
  digitalWrite(latchPin, LOW);
}
Laatst gewijzigd door pjh op 04 Jan 2013, 23:20, in totaal 3 keer gewijzigd.

Advertisement

Gebruikers-avatar
Berichten: 270
Geregistreerd: 30 Dec 2012, 11:42

Re: Werklamp van de Action: Met MORSE-code herkenning

Berichtdoor Rudi » 30 Dec 2012, 13:10

Leuk projectje.
Maar ik snap iets niet. Op het filmpje (op 8:16 en 8:38) meen ik duidelijk te zien dat de weerstanden op de 8 onderbroken met minteken aangeduide printbanen (de rijen) zijn aangesloten en de + printbaan per LEDje werd onderbroken en tot drie kolommen werd overbrugd. Zo verkijg je toch 8 rijen met kathodes en drie kolommen met anodes?
Wat zie ik fout of over het hoofd?
Arduinows!
Why do computer programmers confuse Halloween with Christmas? Because Oct 31 = Dec 25
I got 01100011 problems but a bit ain't 00000001

Gebruikers-avatar
Berichten: 700
Geregistreerd: 05 Mrt 2012, 21:56
Woonplaats: Appingedam

Re: Werklamp van de Action: Met MORSE-code herkenning

Berichtdoor pjh » 30 Dec 2012, 14:52

Klopt helemaal,
Ik heb:
- 8 kathodes en
- 3 anodes

De 8 kathodes sluit ik aan op een shift register.
Omdat het kathodes zijn, moet ik een output OP NUL ZETTEN om het ledje AAN te krijgen

if ( b1 & (0X80 >> k) ){
digitalWrite(dataPin, LOW);
}
else{
digitalWrite(dataPin, HIGH);
}


Als de LED aan moet gaat dataPin naar LOW en else HIGH... Dus in HIGH, tenzij lampje AAN moet. Tegen intuitief, dat wel.

De 3 anodes schakel ik met een transistor met ieder een eigen arduino-pinnetje.
Door deze drie anodes zeer snel af te wisselen, en er steeds de bijpassende kathodes UIT te zetten, krijg ik mijn patronen

hier voorbeeld om één LEDje aan te zetten
rij: 2de Anode op 5Volt, rest 0Volt
kollom: 4de Kathode op 0Volt, rest op 5Volt

Anode 0V 5V 0V
kathode 5V o o o
kathode 5V o o o
kathode 5V o o o
kathode 0V o + o
kathode 5V o o o
kathode 5V o o o
kathode 5V o o o
kathode 5V o o o

Als een LED geen DIODE zou zijn en stroom in één richting blokkeert, zou met een opstelling als deze 15 lampjes lampjes aan zijn:

Anode 0V 5V 0V
kathode 5V + o +
kathode 5V + o +
kathode 5V + o +
kathode 0V o + o
kathode 5V + o +
kathode 5V + o +
kathode 5V + o +
kathode 5V + o +

Met gloeilampern (zie ook: http://www.decadecounter.com/vta/tubepage.php?item=17) werkt het dus niet.

Gebruikers-avatar
Berichten: 270
Geregistreerd: 30 Dec 2012, 11:42

Re: Werklamp van de Action: Met MORSE-code herkenning

Berichtdoor Rudi » 30 Dec 2012, 19:25

pjh schreef:Klopt helemaal,
Ik heb:
- 8 kathodes en
- 3 anodes

De 8 kathodes sluit ik aan op een shift register.
Omdat het kathodes zijn, moet ik een output OP NUL ZETTEN om het ledje AAN te krijgen

Snap ik en zo zie ik het ook op de video. Maar dat is net het tegenovergestelde van wat er in de beginpost (en op de tekening) staat:
pjh schreef: Ik heb deze gemultiplext en verbonden met een ATMega328 “Arduino” via een shiftregister op de 8 anodes en 3 keert een 2N2222 transistor op de kathodes.

Ik wil niet vitten hoor, alleen maar begrijpen.
Heb gisteren de werklamp gekocht om, in afwachting van een LED matrix en andere componenten die nog besteld moeten worden, wat te experimenteren met de multiplexing techniek.
Arduinows!
Why do computer programmers confuse Halloween with Christmas? Because Oct 31 = Dec 25
I got 01100011 problems but a bit ain't 00000001

Gebruikers-avatar
Berichten: 700
Geregistreerd: 05 Mrt 2012, 21:56
Woonplaats: Appingedam

Re: Werklamp van de Action: Met MORSE-code herkenning

Berichtdoor pjh » 30 Dec 2012, 19:46

Je hebt helemaal gelijk.
Die werktekening heb ik achteraf snel in elkaar getekend en deze fout gemaakt.
Klopt. Hoop je niet te veel in verwarring te hebben gebracht.
Groet, Paul

Gebruikers-avatar
Berichten: 270
Geregistreerd: 30 Dec 2012, 11:42

Re: Werklamp van de Action: Met MORSE-code herkenning

Berichtdoor Rudi » 30 Dec 2012, 21:01

Was effe verwarrend maar is nu duidelijk, dankjewel.
Eigenlijk maakt het niet uit, zolang je ieder LEDje maar apart kan adresseren cq aan/uit zetten.
Dan ga ik nu het printplaatje onder het mes brengen :) en experimenteren.
Arduinows!
Why do computer programmers confuse Halloween with Christmas? Because Oct 31 = Dec 25
I got 01100011 problems but a bit ain't 00000001

Gebruikers-avatar
Berichten: 700
Geregistreerd: 05 Mrt 2012, 21:56
Woonplaats: Appingedam

Re: Werklamp van de Action: Met MORSE-code herkenning

Berichtdoor pjh » 30 Dec 2012, 21:59

Vind het tof dat je het een poging waagt.
Geloof dat de zaklamp 2,99 euro was.
Heel veel verkeerd kun je niet doen....

Verder heb ik hier nog een paar van hun PIR-nachtlampjes liggen. Wil nog steeds een array van die dingen maken, om te kijken of ik een bepaalde resolutie kan bereiken. Of anders een "interessante input" kan generen voor LEDjes. Wat anders....
Succes ermee. En ik hoor erg graag hoe het je gaat.
Als het niet lukt, stuur ik je die van mij op!

Gebruikers-avatar
Berichten: 270
Geregistreerd: 30 Dec 2012, 11:42

Re: Werklamp van de Action: Met MORSE-code herkenning

Berichtdoor Rudi » 03 Jan 2013, 22:49

De voorbije dagen enkel met de ledjes matrix aan het spelen geweest en er wat effecten op uitgeprobeerd, zonder de 74HC595 te gebruiken.
Omdat de ledjes heel wat licht geven heb ik 1000 ohm voorschakelweerstanden gebruikt, zelfs dan nog veel licht maar wel stroombesparend :)

Vanavond op het breadboard dan jouw opstelling gemaakt Paul.
Heb de Capacitive Sensing library hier afgehaald http://playground.arduino.cc//Main/CapacitiveSensor?from=Main.CapSense en ze gebruikt in jouw code met een kleine aanpassing van de eerste twee regels:
Code: Alles selecteren
#include <CapacitiveSensor.h>
CapacitiveSensor cs_4_2 = CapacitiveSensor(12,13);

en de vierde regel in de void loop()
Code: Alles selecteren
long total =  cs_4_2.capacitiveSensor(30);

Works like a charm.
Arduinows!
Why do computer programmers confuse Halloween with Christmas? Because Oct 31 = Dec 25
I got 01100011 problems but a bit ain't 00000001

Gebruikers-avatar
Berichten: 700
Geregistreerd: 05 Mrt 2012, 21:56
Woonplaats: Appingedam

Re: Werklamp van de Action: Met MORSE-code herkenning

Berichtdoor pjh » 03 Jan 2013, 23:39

:D :D :D :D

Gebruikers-avatar
Berichten: 270
Geregistreerd: 30 Dec 2012, 11:42

Re: Werklamp van de Action: Met MORSE-code herkenning

Berichtdoor Rudi » 04 Jan 2013, 20:55

Nog even het schema meegeven. Merk op dat er geen extra transistoren worden gebruikt.
Door de weerstanden van 1000 ohm blijft de stroom door de leds lager dan wat de 74HC595 per output maximaal kan schakelen.

Afbeelding
Arduinows!
Why do computer programmers confuse Halloween with Christmas? Because Oct 31 = Dec 25
I got 01100011 problems but a bit ain't 00000001

Volgende

Terug naar Afgeronde projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 14 gasten