Zoeken in deze blog

zondag 7 november 2010

HamKlok One

Ok ik begrijp de chaos die ik heb gecreëerd. Beginnen met een moeilijk project een beetje info geven over de Arduino en dan opeens onderdelen van een klok beschrijven. Niet veel structuur zal ik maar zeggen !

Maar het wordt beter want ik heb besloten dit project opnieuw te starten en dan stap voor stap de verschillende delen van dit project uiteen te zetten in een soort vervolg verhaal. Afhankelijk van mijn vorderingen zal duidelijk worden hoe een en ander verloopt.

En ja er zit een microprocessor in het project maar alles, dus ook de programmeer omgeving is open source, is voor een kleine beurs toegankelijk. En moeilijk ? Ja en Nee gewoon proberen en vragen als je iets niet begrijpt!!

Wat wil ik met dit project bereiken ?
Een hamklok met groot afleesbare tekens waarbij tevens de temperatuur en luchtvochtigheid wordt getoond.
Verder is het leuk als er de tijd voor verschillende tijdzones gekozen kan worden.
Verdere opties zijn een r.f. link naar het weerstation (433,600 Mhz) zodat in de klok windrichting en windsnelheid kan worden afgelezen.
In de toekomst de mogelijkheid om de totale functionaliteit van de klok via het WEB te benaderen door het inbouwen van een webserver....
En verder was er nog een grapjas die middels een PIR sensor en een MP3 bestand een gesproken tijd wou laten afspelen. In de trant van als er iemand in de buurt van de klok komt dat de klok zegt "het is tien uur drie , het is koud en ga nu maar naar bed.. einde bericht"
Maar alle gekheid op een stokje eerst maar gewoon een standaard Hamklok.
Hiervoor gebruiken we drie basis onderdelen:

  1. De microprocessor, welke het brein gaat vormen.
  2. Het display, in dit geval 6 blokjes met 8* 8 LED's (fabrikaat Shure)
  3. De eigenlijke klok welke is opgebouwd met het Dallas IC RT1307
Het lijkt heel wat maar het valt wel mee. De processor is kant en klaar te koop en afhankelijk van het geduld kun je hier aankomen voor nog geen 19 dollar of in Nederland voor ongeveer 30,00 euries.
Het display is via Ebay te koop en kost je 12,50 dollar en heb je in 2 weken in huis.
De klok (Real Time Clock afgekort RTC ) maken we lekker zelf en kost minder dan 10 euries.

Dus het hele basis apparaat gaat niet meer dan 50,00 euro kosten.
Na afloop heb je veel geleerd en een klok die op 3 meter afstand is af te lezen !!!

Even voorstellen : Het Arduino processor printje
Het printje bestaat uit :

  • de voeding
  • de processor
  • seriële communicatie chip (virtuele COM poort) met behulp van USB chip
  • diverse aansluitingen voor digitale en analoge zaken
Verder is het mogelijk via I2C,one wire met de processor te communiceren maar daar kom ik later op terug.
Hieronder de layout van het printje.

en zo ziet dat er in werkelijkheid uit.
Dit is het hart van het project ! Links boven de USB aansluiting en rechtsonder de microprocessor. Links naast het kristal zit de omzetter die ervoor zorgt dat we de microprocessor als virtuele COM poort kunnen benaderen!

Alles wat betrekking heeft op de Arduino , dus ook alle gratis software, kan je vinden op http://www.arduino.cc/
als je een printje wilt bemachtigen dan kan dat in Nederland bij b.v http://www.eztronics.nl/, http://www.antratek.nl/ , http://iprototype.nl/ maar er zijn meer aanbieders! Ook via Ebay gaat het goed maar dan moet je iets meer geduld hebben ( 10 tot 20 dagen). Daar zijn vele clones te koop voor vaak minder dan 20 euro inclusief verzend kosten. Momenteel is er de UNO
maar voor ons project voldoen ze allemaal !

Om leven in het printje te krijgen is voedingspanning nodig. Een 9 volt 200mA voeding is ruim voldoende, zelf heb ik meestal genoeg aan de voeding die rechtstreeks uit de USB poort van de computer komt!
Later als de klok gaat vorderen is het misschien beter om een voeding van 500mA aan te sluiten.
Oh ja het printje is beveiligd tegen polariteits wisseling op de voedingsconnector maar niet op de 9V pin op de onderste aansluitrij !!!!!!

Het tweede element van de klok is het display dit is een via Ebay te verkrijgen gigant n.l. de SHURE 

24×16 2416 Dot Matrix Green Display info Board Arduino


Ik heb zelf een rode gekozen maar dat maakt verder geen verschil.

Het laatste deel is de RTC real time clock. Hiervoor heb ik een apart printje gemaakt op basis van een Dallas DS1307 en een 32 khz kristal (ook via Ebay, voor de eerste paar liefhebbers heb ik er nog wel een !)

Het printje meet 4 bij 6 cm en de meeste ruimte neemt de batterij in ! Het kleine piefje boven het IC is het klokkristalletje !







zaterdag 6 november 2010

Temperatuur/vochtsensor gearriveerd !

Vandaag is de volgende uitbreiding voor de klok gearriveerd! De SHT15 sensor kan zowel temperatuur alsmede de luchtvochtigheid meten.
Dit kleine blokje van 6mm bij 4mm kan via twee lijnen SCK en DATA met de Arduino communiceren.
Hieronder even een testopstelling en het resultaat van de meting. Links de Arduino met het sensor shield en rechts de SHT15 sensor shield. Twee kabeltjes verbinden beide shields met elkaar.

Een kort programma in de Arduino zend de gegevens via de com poort naar buiten. Via een terminal programma is een en ander zichtbaar.
Nu dit direct werkt is het handig het project eens goed te gaan documenteren want het aantal gebruikte pinnen binnen de Arduino loopt snel op.
De volgende stap is dus een schema en lay out maken!


zondag 31 oktober 2010

Real time klok en Sure display vervolg

Gisteren het paneeltje met schakelaars gemaakt. Van 5 mm plexiglas 3 lagen op elkaar gelijmt en een opening voor 4 schakelaars uitgefreesd. De onderste laag is bedoeld om de bedrading naar de schakelaars weg te werken.
Het geheel monteer ik dan voor op het klok front.
Toch maar voor 4 schakelaars gekozen.
Menu-doorstappen menu-op-neer. Kan nog veranderen maar nu lijkt het de beste optie.



Ook een begin gemaakt met uit te zoeken of de klok via 9 volt gevoed kan worden. De 9 volt blok accus van de LIDL zijn wel erg snel leeg...... Zal eens meten wat het display werkelijk trekt.

vrijdag 29 oktober 2010

Realtime klok en Sure display vervolg

Ok vandaag weer een stapje verder gekomen. In Groningen een nieuwe DS1307 gekocht maar de 1 Hz puls werkte nog niet! Dus IC kennelijk niet kapot !!!
Na meting met universeelmeter bleek printspoortje naar pin 7 sluiting met massa te maken!!! Na dit verholpen te hebben alles nu ok!
In het display nu twee leds aangestuurd in het ritme van de 1 Hz puls, hoog led 12,2 en laag led 12,5.

Nu nog het gelijk zetten van de klok met drie schakelaartjes realiseren.
Ik denk aan de volgende mogelijk heid.
schakelaar 1 kies mode.  uren of minuten
schakelaar 2 plus puls
schakelaar 3 min puls

Kijken of dit een bevredigend resultaat opleverd.
Hier even een foto...

donderdag 28 oktober 2010

Real time klok en Sure display vervolg

Ok weer een stapje verder, het instellen van de tijd met schakelaartjes is uitgeprobeerd en kan verder in de software worden ingevoerd. Wel tegen een ander probleem aangelopen, de seconden output op pin 7 SQW van de DS1307 werkt niet. Het zou kunnen dat ik de open collector om zeep heb geholpen door het verkeerd aansluiten van een controle led en pullup weerstand. ( zo'n ledje kan echt stinken als je plus en min aansluit zonder stroombegrensings weerstand !!!!)

Dus morgen maar 6 euro besteden aan een nieuw exemplaar om te kunnen vergelijken !

woensdag 27 oktober 2010

Real time klok en Sure display

RTC DS1307 en Sure 24*16 led display moeten samen een digitale klok gaan vormen.

Een deel is nu klaar en de komende tijd zal ik verslag doen van dit project.
De realtime klok DS1307 werkt en ook de battery lijkt ervoor te zorgen dat de tijd door blijft gaan na afschakelen van de voedingspanning. De tijd wordt nu weergegeven op de bovenste helft van het display. Oorspronkelijk heb ik gekozen voor cijfers opgebouwd uit 7 leds hoog en 5 leds breed maar nu gebruik ik 7*4 leds zodat de cijfers wat verder uit elkaar staan. Zal morgen even een fototje maken. Gelijk zetten gaat nu nog een beetje ingewikkeld ( via een terminal programma) maar ik ben bezig met een gelijk set menu.
Uitbreiding met metingen voor temperatuur en luchtvochtigheid staan op het programma en misschien een hf verbinding naar het weerstation buiten....

Vanmiddag in oude kwam het idee, uit een geintje met een collega, om de klok te laten spreken. Dit zou afhankelijk van de tijd kunnen zijn of als er zich bepaalde situaties voordoen zoals,iemand in de buurt (PIR sensor) of op basis van een temperatuur/luchtvochtigheid waarde...

Wie weet welke kant het opgaat.

dinsdag 14 september 2010

Eerste Arduino project werkt !

Het heeft wat voeten in de aarde gehad maar de spanning naar weerstand omzetter werkt!
Bij de DS1804 pootje 7 (vrijgave) ook via de Arduino bestuurd en in het regelatgorithme toch maar een kleine hystereses ingebouwd.
Een tweede probleem was de gelijkstroommotor regelaar. Er wordt een potmeter van 5K verwacht. De DS 1804 is echter 10K dus de Arduino software gelijk gehouden echter de analoge ingangswaarde van de teleradio door twee gedeeld met twee weerstandjes van 15K.

Dit zorgt wel voor een halvering van het aantal regelstapjes maar ......

Hieronder de complete software:
/*
 Dit programma leest de rechter en linker joystickknuppel van een Teleradio afstandbesturing
 De uitgaande analoge signalen 0 tot 10 Volt worden eerst middels een spanningsdeling 10K + 10K
 door 2 gedeeld waardoor het bereik van 0 tot 5 Volt loopt.
 Deze signalen worden aangeboden aan een Arduino bordje met ATMEGA 328P microprocessor

 Afhankelijk van de aangeboden analoge waarde genereerd de microprocessor een pulstrein
 volgens de formule : (gemeten waarde - vorige gemeten waarde) / 10
 Tevens wordt gekeken of de opvolgende gemeten waarde lager of hoger is dan de vorige waarde.

 Parosha groep augustus 2010
 a.koopman@tsotechniek.nl

 */
// Constanten zoals gebruikt in het programma
const int analogLinks = 0;     // linker kanaal gekoppeld aan analoog kanaal 0
const int analogRechts = 1;    // rechter kanaal gekoppeld aan analoog kanaal 1
const int ledPinUR = 6;       // Up-Down potmeter rechts
const int ledPinR = 5;        // Puls potmeter rechts
const int ledPinUL = 4;       // Up-Down potmeter links
const int ledPinL = 3;        // Puls potmeter links
const int threshold = 400;   // an arbitrary threshold level that's in the range of the analog input
const int ledPinVR = 7;     //vrijgave potmeter rechts
const int ledPinVL = 8;     //vrijgave potmeter links
// aantal begin waarden vastleggen
int LinksOud = 0;
int RechtsOud = 0;
int VerschilR = 0;
int VerschilOudR = 0;
int VerschilL = 0;
int VerschilOudL = 0;
int PulsL = 0;
int PulsR = 0;
int eenmaal = 0;
// setup eenmaal doorlopen maak pennen naar DS1804 output
void setup() {
  pinMode(ledPinUR, OUTPUT);
  pinMode(ledPinR,OUTPUT);
  pinMode(ledPinUL,OUTPUT);
  pinMode(ledPinL,OUTPUT);
  pinMode(ledPinVR,OUTPUT);
  pinMode(ledPinVL,OUTPUT);
  // initialize serial communications:
  Serial.begin(9600);
  // print tussen waarden om monitoring mogelijk te maken !
}

// Nu gaat het echt beginnen !
void loop() {
  // potmeters éénmaal naar 0 zetten
  if (eenmaal <1)
  {
    digitalWrite(ledPinUL,LOW);  //verlagen van de pulsen
    digitalWrite(ledPinUR,LOW);
    digitalWrite(ledPinVL,LOW);  // vrijgave potmeter links
    digitalWrite(ledPinVR,LOW);  // vrijgave potmeter rechts
    for (int i=0; i <= 99; i++)
    {
      digitalWrite(ledPinL, HIGH);
      digitalWrite(ledPinR,HIGH);
      delay(1);
      digitalWrite(ledPinL, LOW);
      digitalWrite(ledPinR,LOW);
      delay(1);
    }
 
  digitalWrite(ledPinVL,HIGH);  // blokkeren potmeter links
  digitalWrite(ledPinVR,HIGH);  // blokkeren potmeter rechts
  eenmaal = 1;                  // blokkeren 0 zetten
  delay(1000);                  // even rust !
  }
  // joystick waarden inlezen:
 
  int analogValueL = analogRead(analogLinks);
  delay(2);
  //Serial.write("linkerwaarde = ");
  //Serial.println(analogValueL);
  int analogValueR = analogRead(analogRechts);
  //delay(10);
  Serial.write("rechterwaarde = ");
  Serial.println(analogValueR);
  // Eerst maar even het linker kanaal afhandelen !
  if ((analogValueL - LinksOud) > 5)
  {
    digitalWrite(ledPinUL,HIGH);  //ophogen van de pulsen
    digitalWrite(ledPinVL,LOW);  // vrijgave potmeter
    VerschilL = (analogValueL - LinksOud)/11;
    if ((VerschilL + VerschilOudL) > 90)
    {
      VerschilL = 90;
    }
    else
    {
      VerschilL = VerschilL;
    } 
    LinksOud = analogValueL;
    VerschilOudL = VerschilL;
    // pulstreinje opbouwen 1 ms 
    for (int i=0; i <= VerschilL; i++)
    {
      digitalWrite(ledPinL, HIGH);
      delay(1);
      digitalWrite(ledPinL, LOW);
      delay(1);
    }
  }
  else if(analogValueL < LinksOud)
  {
    digitalWrite(ledPinUL,LOW);  // verlagen van de pulsen
    digitalWrite(ledPinVL,LOW);  // vrijgave potmeter
    VerschilL = (LinksOud - analogValueL)/11;
    VerschilOudL = VerschilL;
    LinksOud = analogValueL;

    // pulstreinje opbouwen 1 ms  
    for (int i=0; i <= VerschilL; i++)
    {
      digitalWrite(ledPinL, HIGH);
      delay(1);
      digitalWrite(ledPinL, LOW);
      delay(1);
    }
  }
  else
  {
    VerschilL = 0;
    VerschilOudL = 0;
    digitalWrite(ledPinVL,HIGH);  // blokkade potmeter
  }
 
 
  // En nu dan het rechter kanaal!
  Serial.write("verschilwaarde = ");
  Serial.println(VerschilR);
  if ((analogValueR - RechtsOud)>5)
  {
    digitalWrite(ledPinUR,HIGH);  //ophogen pulsen
    digitalWrite(ledPinVR,LOW);  // vrijgave potmeter
    VerschilR = (analogValueR - RechtsOud)/11;
    if ((VerschilR + VerschilOudR) > 90)
    {
      VerschilR = 90;
    }
    else
    {
      VerschilR = VerschilR;
      VerschilOudR = VerschilR;
    } 
    RechtsOud = analogValueR;
    // pulstreinje opbouwen 1 ms  
    Serial.write("ophogen!");
    for (int i=0; i <= VerschilR; i++)
    {
      digitalWrite(ledPinR, HIGH);
      delay(1);
      digitalWrite(ledPinR, LOW);
      delay(1);
    }
  }
  else if(analogValueR < RechtsOud)
  {
    digitalWrite(ledPinUR,LOW);
    digitalWrite(ledPinVR,LOW);  // vrijgave potmeter
    VerschilR = (RechtsOud - analogValueR)/11;
    VerschilOudR = VerschilR;
    RechtsOud = analogValueR;
    // pulstreinje opbouwen 1 ms  
    Serial.write("verlagen!");
    for (int i=0; i <= VerschilR; i++)
    {
      digitalWrite(ledPinR, HIGH);
      delay(1);
      digitalWrite(ledPinR, LOW);
      delay(1);
    }
  }
    else
  {
    VerschilR = 0;
    VerschilOudR = 0;
    Serial.write("doe niks!");
    digitalWrite(ledPinVR,HIGH);  //blokkade potmeter                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           ,HIGH);  // blokkade potmeter
  }
  // wachtlus van 500 ms anders wordt het zo zenuwachtig !
  delay(500);
}