Der  von der  Fa. FTDI produzierte FTDI232RL wandelt die USB Pegel in ein RS232 Signal um. Es werden die Pins TX RX DTR und DSR unterstützt.  Für das Programmieren des Arduino ist das DTR Signal wichtig, das den zum Programmiervorgang  benötigte Reset am Ende erzeugt.

 Warnung zur Zeit sind die meisten Chips Nachbauten aus China. Mit der aktuellen Treiberversion werden diese Chips zerstört.
Bis die Situation geklärt ist und ich einwandfreie Ware anbieten kann habe ich diesen Artikel aus meinem Shop entfernt.

Hie ein Bild von einem Selbstbau Arduino.

ftdi350Der Anschluss ist ganz einfach, Betriebspannung, RS an TX und TX an RX wo bei es einem selbst überlassen bleibt obt man direkt an den Atmega oder oben rechts an die digitalen Anschlüsse lötet.
Damit das ganze funktioniert muss das DTR Signal noch über einen Kondensator an Reset angeschlossen werden.
Laut Schaltung ist es ein 100nf (0,1µf). Das hat bei mir auch funktioniert, aber nur auf dem ersten Board. Ich habe dann einen Elko ich glaube 0,47µf eingebaut.

Wer die Schaltung auch in der Arduino Programmierumgebung nutzen will muss noch einen Bootloader installieren.
Bei Ebay wird der Atmega328p auschließlich mit installiertem Bootloader angeboten. Auch in meinen Bausätzen.


Ansonsten müsst Ihr den Bootloader selbst installieren.
Das geht nur über die ISP Schittstelle mit einem Programmiergerät. Man kann auch in einen vorhandenen Aruino einen ISP Sketch laden und diesen dann als Programmer benutzen. Das Kapitel muss ich noch testen.

Mit dem Bootloader aus der Arduino Version 1.04 hat es bei mir nicht funktioniert. Ich habe dann den Optiboot installiert.
 

Eine ältere Treibervision kann ich auf Wunsch per Mail schicken. Der Aktuelle Treiber steht bei FTDI zum download zur Verfügung.

  Downloads:                     Optiboot Bootloader
     

FTDI an USB

               

 

PWM

Mit der Pulsweitenmodulation ist es möglich LEDs oder Motore stufenlos von ganz langsam bis hanz hell zu regeln. Dazu wird ein Rechtecksignalerzeugt dessen Flanke verschieden breit ist.
Bei den meisten Arduino-Boards (diejenigen mit einem ATmega168 oder ATmega328) ist das mit den Pins 3, 5, 6, 9, 10, und 11 möglich; bei einem Arduino-Mega sind das die Pins 2 bis 13. Bei älteren Arduino-Boardsmit einem ATmega8 wird analogWrite() an den Pins 9, 10, and 11 unterstützt.

Für den nachfolgen Nightridersketch reicht das nicht. Man kann PWM auch mit der Software erzeugen und an jeden Pin ausgeben. Wer Atmega schon mit anderen Sprachen programmiert hat weis das. Für Arduino gibt es eine fertige Libary die die Programmierung einfach macht und alles auf das wesentliche beschränkt.

Hier der Downloadlink für den Sketch

Hier der Downloadlink für die Libary

Ich habe den Sketch auf 10 LED's erweitert

 

 
 

Projekt Digitaluhr mit Arduino Uno und DS1307

 

Den Bau des LCD-Shield mit nur 3 Pin sowie die Realtimeclock DS1307 habe ich bereits schon beschrieben.In diesem Projekt wurden die fertigen Shields dann nur noch zusammengesteckt. Das Programm habe ich erweitert so das sich die Uhr auch stellen lässt.

Uhrfertig Die Schaltung des Keypads habe ich bereits erläutert. Der Befehl anlogRead liefert je nach gedrückten Knopf einen anderen Wert. Im anhängenden Listing frage ich im Loop ab, ob überhaupt ein Knopf gedrückt wurde.  Wenn ja springt das Programm in die Setroutine und erhöht den Inhalt der zugehörigen Varible um 1 gemäß dem dem Wert von analogRead. Da der Wert ungenau ist und sich verändert habe ich nochmal durck 10 geteilt. Dann funktioniert es sicher.

Bei Nachbau oder Verwendung eines gekauften Shields müssen die Werte eventuell im Programm etwas angepasst werden. Leider ist für das Jahr ein Knopf zu wenig. Ich habe mir weitergeholfen in dem ich um das Jahr zu stellen eine Drahtbrücke von GND nach Digital 0 setzte. Der Taste für Minute setzt dann das Jahr um 1 vor.

 

 

Hier das Listing.Uhrvonoben

 

//Arduino 1.0+ Only
//Arduino 1.0+ Only
//aktuelle Version vom 31.03.2013 Johannes Krumm
#include "Wire.h"
#define DS1307_ADDRESS 0x68
#include <LiquidCrystal595.h>
LiquidCrystal595 lcd(7,8,9);     // datapin, latchpin, clockpin
byte zero = 0x00; //workaround for issue #527
byte wert = 0;

void setup(){
  Wire.begin();
  Serial.begin(9600);
  lcd.begin(16,2);
  lcd.clear();
 
// setDateTime(); //MUST CONFIGURE IN FUNCTION
}

   
void loop(){
  printDate();
  delay(1000);
// Hier werden die Tasten abgefragt und deren Wert angezeigt. Sprung nach Settime
 if (analogRead(0)<1010){settime();lcd.setCursor(9,0);lcd.print(analogRead(0));}else {lcd.setCursor(9,0);lcd.print("    ");}
}
// Wenn dieser Teil auskommentier ist wird die Zeit gesezt. Nach dem ersten setzten muss diese Teil
// wieder einkommentiert werden, sonst wird die Zeit nach jedem Reset oder Start wieder so zurückgesetzt.
// Der auskommentierte Teil kann auch ganz geloescht werden. Die Zeit lässt sich ja per Taste setzen.
/*void setDateTime(){

  byte second =      45; //0-59
  byte minute =      10; //0-59
  byte hour =       22; //0-23
  byte weekDay =     6; //1-7
  byte monthDay =    23; //1-31
  byte month =       3; //1-12
  byte year  =       13; //0-99

  Wire.beginTransmission(DS1307_ADDRESS);
  Wire.write(zero); //stop Oscillator

  Wire.write(decToBcd(second));
  Wire.write(decToBcd(minute));
  Wire.write(decToBcd(hour));
  Wire.write(decToBcd(weekDay));
  Wire.write(decToBcd(monthDay));
  Wire.write(decToBcd(month));
  Wire.write(decToBcd(year));

  Wire.write(zero); //start

  Wire.endTransmission();

}*/

byte decToBcd(byte val){
// Convert normal decimal numbers to binary coded decimal
  return ( (val/10*16) + (val%10) );
}

byte bcdToDec(byte val)  {
// Convert binary coded decimal to normal decimal numbers
  return ( (val/16*10) + (val%16) );
}

void printDate(){

  // Reset the register pointer
  Wire.beginTransmission(DS1307_ADDRESS);
  Wire.write(zero);
  Wire.endTransmission();

  Wire.requestFrom(DS1307_ADDRESS, 7);

  int second = bcdToDec(Wire.read());
  int minute = bcdToDec(Wire.read());
  int hour = bcdToDec(Wire.read() & 0b111111); //24 hour time
  int weekDay = bcdToDec(Wire.read()); //0-6 -> sunday - Saturday
  int monthDay = bcdToDec(Wire.read());
  int month = bcdToDec(Wire.read());
  int year = bcdToDec(Wire.read());

  //print the date EG   3/1/11 23:59:59
  lcd.setCursor(0,1);
  if (monthDay<10)
  {lcd.print("0");}
  lcd.print(monthDay);
  lcd.print(".");
  lcd.print(month);
  lcd.print(".");
  lcd.print(year);
  lcd.setCursor(0,0);
   if (hour < 10)                  // correct hour if necessary
  {
    lcd.print("0");
    lcd.print(hour);
  }
  else
  lcd.print(hour);
  lcd.print(":");
   if (minute < 10)                  // correct minute if necessary
  {
    lcd.print("0");
    lcd.print(minute);
  }
  else
  lcd.print(minute);
  lcd.print(":");
    if (second < 10)                  // correct second if necessary
  {
    lcd.print("0");
    lcd.print(second);
  }
  else
  lcd.print(second);
 
   switch (weekDay)                      // Ausgabe des Wochentages
 {
 
    case 1:
      lcd.setCursor(8,1);
      lcd.print("Montag ");
      break;
    case 2:
       lcd.setCursor(8,1);
      lcd.print("Dienstag");
      break;
    case 3:
    lcd.setCursor(8,1);
      lcd.print("Mittwoch");
      break;
    case 4:
    lcd.setCursor(8,1);
      lcd.print("Donnerst");
      break;
    case 5:
    lcd.setCursor(8,1);
      lcd.print("Freitag ");
      break;
    case 6:
    lcd.setCursor(8,1);
      lcd.print("Samstag ");
      break;
    case 7:
    lcd.setCursor(8,1);
      lcd.print("Sonntag ");
      break;
  }
}
void settime(){
 Wire.beginTransmission(DS1307_ADDRESS);
  Wire.write(zero);
  Wire.endTransmission();

  Wire.requestFrom(DS1307_ADDRESS, 7);

  int second = bcdToDec(Wire.read());
  int minute = bcdToDec(Wire.read());
  int hour = bcdToDec(Wire.read() & 0b111111); //24 hour time
  int weekDay = bcdToDec(Wire.read()); //0-6 -> sunday - Saturday
  int monthDay = bcdToDec(Wire.read());
  int month = bcdToDec(Wire.read());
  int year = bcdToDec(Wire.read());
 
 Wire.beginTransmission(DS1307_ADDRESS);
  Wire.write(zero); //stop Oscillator
 
if (analogRead(0)/10==0){minute=minute+1; if (minute>=60){minute=0;}}
if (analogRead(0)/10==14){hour=hour+1; if (hour>=24){hour=0;}}
if (analogRead(0)/10==33){month=month+1; if (month>=12){month=0;}}
if (analogRead(0)/10==50){monthDay=monthDay+1; if (monthDay>=31){monthDay=0;}}
if (analogRead(0)/10==74 and digitalRead(0)!=LOW){weekDay=weekDay+1; if (weekDay>=8){weekDay=0;}}
if (analogRead(0)/10==74 and digitalRead(0)== LOW){year=year+1;if (year>30){year=0;} }
  Wire.write(decToBcd(second));
  Wire.write(decToBcd(minute));
  Wire.write(decToBcd(hour));
  Wire.write(decToBcd(weekDay));
  Wire.write(decToBcd(monthDay));
  Wire.write(decToBcd(month));
  Wire.write(decToBcd(year));

  Wire.write(zero); //start

  Wire.endTransmission();

}

 

 

Login Form