Für ein Schulprojekt hatte ich einige Ardunio kompatible Boards in China gekauft. Liefen bis immer problemlos.
Blos bei diesem hier habe ich erstmal ein blödes Gesicht gemacht. Ein Blick mit der Lupe auf den Chip sagte mir alles.
Hier wurde kein Atmega 328p verbaut sonder ein AVAG328P aus China.
Einmal kurz Google zur Hilfe genommen. und Problem gelöst.
Der CH340 ist in Windows 10 enthalten und wird automatisch installiert. Falls nicht Frau Google fragen.

Bitte neueste Arduino IDE verwenden. z. Z. 1.8.8

Die Software für die CPU bitte hier downloaden und entpacken.

Dann das verzeichnis Libraries und Hardware nach

c:\user\deinname\documents\Arduino kopieren.

Arduino IDE neu starten. WAVGAT im Boardmanager zuweisen. Auch an den richtigen Port denken.
Sollten beim Compilieren noch Warnings auftreten, dann die entspechende Platform.txt patchen. (....... /dokuments/arduino/hardware/avr
Anstatt:
recipe.ar.pattern="{compiler.path}{compiler.ar.cmd}" {compiler.ar.flags} {compiler.ar.extra_flags} "{build.path}/{archive_file}" "{object_file}"
kommt jetzt:
recipe.ar.pattern="{compiler.path}{compiler.ar.cmd}" {compiler.ar.flags} {compiler.ar.extra_flags} "{archive_file_path}" "{object_file}"

awavgat

 Dann habe ich festgestellt das der Chip einen 12bit AD-Wandler hat.

Bei 5V ist der AD dann 2540
Sketches die dort eine Division durch 1024 machen müssen dann auf 2540 geändert werden.

 

MQ 5 ist für Propan Butan bzw LPG für Flüssiggas. Der Sensor reagiert auch auf Alkohol Kohlenmonoxyd Erdgas und Rauchgase, aber für diese
Gase gibt es andere Sensoren.gibt es andere.

Ganz einfach wie im Bild anschliessen. GND, +5V und A0. Wozu D0 ist hab ich noch nicht rausgefunden.
Die rote LED sollte leuchten , die grüne kann. Das Poti dient der Kalibrierung. Einfach soweit dehen bis die grüne LED erlischt, dann hat man den Schwellpunkt.
Mit einem Gasfeuerzeug ohne Flamme testen. Die Grüne LED sollte jetzt leuchten

In der seriellen Ausgabe des Arduino sieht man einen deutlichen Anstieg des Analogen Wertes.
Zur exakten Anzeige in PPM muss eine Referenzmessung mit einer bekannten Grösse gemacht werden.
Wie man das macht hab ich noch nicht raus. Man kann aber feststellen das etwas da ist und wenn was da ist dann ist was undicht. Das sollte reichen um diversere Leitungen und Schläuche auf Dichtigkeit zu prüfen.
Man könnte den Sketch etwas ändern und beim Anstieg des AD Wertes einen Buzzer piepen lassen. Prima Warnung für Wohnwagenbesitzer.

MQ5 Propan Lq5 Sensor am Arduino

Hier ein einfacher Sketch zum testen.

///Arduino Sample Code
void setup()
{
  Serial.begin(9600); //Set serial baud rate to 9600 bps
}
void loop()
{
int val;
val=analogRead(0);Read Gas value from analog 0
Serial.println(val,DEC);//Print the value to serial port
delay(100);
}
 

MQ7 CO Sensor

Das Breakout ist geauso aufgebaut wie das für den MQ5 lediglich der Sensor ist speziel für das gefährliche Kohlelnmonoxyd ausgelegt.

Der Sketch ähnelt dem des MQ5 wertet aber den Digitalwert mit aus, der bei Schwellwert auf  High wechselt.

/* MQ-7 Carbon Monoxide Sensor Circuit with Arduino */

const int AOUTpin=0;//the AOUT pin of the CO sensor goes into analog pin A0 of the arduino
const int DOUTpin=8;//the DOUT pin of the CO sensor goes into digital pin D8 of the arduino
const int ledPin=13;//the anode of the LED connects to digital pin D13 of the arduino

int limit;
int value;

void setup() {
Serial.begin(9600);//sets the baud rate
pinMode(DOUTpin, INPUT);//sets the pin as an input to the arduino
pinMode(ledPin, OUTPUT);//sets the pin as an output of the arduino
}

void loop()
{
value= analogRead(AOUTpin);//reads the analaog value from the CO sensor's AOUT pin
limit= digitalRead(DOUTpin);//reads the digital value from the CO sensor's DOUT pin
Serial.print("CO value: ");
Serial.println(value);//prints the CO value
Serial.print("Limit: ");
Serial.print(limit);//prints the limit reached as either LOW or HIGH (above or underneath)
delay(100);
if (limit == HIGH){
digitalWrite(ledPin, HIGH);//if limit has been reached, LED turns on as status indicator
}
else{
digitalWrite(ledPin, LOW);//if threshold not reached, LED remains off
}
}

 
 

 

 

Arduino Selbstbau auf Lochraster.

Man braucht nur ein paar Teile.
Der Aufbau ist in 3 Schritten beschrieben. Grundschaltung, IO, und Betriebspannung. Wer die 3,3V nicht benötigt und oder fertig programmierte Chips einsetzt kann noch einfacher bauen.

  

Lochrasterplatine

1 Quarz 16Mhz

2 Keramikkondensatoren 22pf 50V

1 10kOhm 1/4 Watt

2 Kondensatoren 100nf 63V (0,1µf)

1 Pinheader  female 40pol.

1 IC Sockel 24pol.

1 Atmega328p

1 Kleinsttaster

   

 1 DC Einbaubuchse

 4 Dioden 1N4007

 1 Spannungsregler 5V

 1 LM317K für 3,3V
 1 Elko 22 - 100µf

 1 Widerstand 330Ohm

 1 Widerstand 470 Ohm

 1 Widerstand 150 Ohm
 1 LED Grün

 1 Wannenstecker 10pol.

 

 

Arduino Selbstbau auf Lochraster

Platine und Pinheader zuschneiden und verlöten.  Die Bauteile montieren und wie im Bild anschliessen. Die Pinheader sind nicht teilbar. Beim teilen geht immer ein Anschluss kaputt.  Ich habe die Platine bewusst länger gelassen, weil vorn noch ein paar Teile draufkommen, die höher sind und die drüberliegenden Shields stören.

 

 

 

Selbstbau Arduino IO Verkabelung

Dieses Bild zeigt die Anschlüsse der IO-Pins. Mann könnte auch noch die Anschlüsseanlog 4 und 5 mit den Anschlüssen oben Links verbinden. Das und der doppelte 5V Anschluss ist die eigenliche Änderung zum Arduino R3. Das hat man gemacht um Shields auch für andere Arduino-Platinen kompatibel bauen zu können.

Wer wie die meisten die 3,3V nicht braucht kann jetzt zB. Eine Buchse einbauen und die Schaltung über ein stabilisiertes Netzteil betreiben.

 

 

Spannungsversorgung

 

Ganz einfach mit einem stabilisierten
Netzteil.

Aduino basteln von Johannes Krumm

Hier kann man mit einem 9-15VNetzteil rein.
Es ist eine Gleichrichtung und ein  5V Regler verbaut.

 Ardunionachbau mit 5V Spanungsversorgung

Durch die Dioden ist der Eingang gegen Verpolung geschützt. Es kann auch eine Wechselspannung eingespeist werden.                                                            

Hier mit 3,3V Erweiterung wird nur selten gebraucht.

Arduino Nachbau mit 5V und 3,3 Volt Spannungsversorgung.

Der Widerstand links vom Regler hat 330Ohm der daneben 470. Die Spannung beträgt ca. 3,1V. Das funktioniert und ist getestet. Wer genau 3,3V haben will muss mit Hilfe der Datenblätter rechnen und andere Widerstände nehmen. Es gibt auch Regler für 3,3V, wenn ich die getestet habe werde ich die Schaltung ändern.

Programmierung,

ganz einfach über einen vorhandenen Arduino und dann den Chip umstecken.

Oder per FTDI Adapter an Arduino. Das geht aber nur wenn ein Bootloader installiert ist. Die von mir gelieferten Bausätze haben einen.

Bootloader installieren und auch programmieren geht auch mit dem USBasp von fischl.de USBasp Eigenbau

Dieses Programmiergerät habe ich nach der Anleitung von Herrn Fischl gebaut.
Es funktioniert. Für Newcommer ist aber das Problem mit dem Huhn und dem Ei da. Man benötigt ein Programmiergerät um das Programmiergerät nachzubauen. Es gibt ganz einfache Kabel die man an den Paralellport des PC´anschliessen kann. Ich rate davon ab weil es immer weniger PC´s mit diesem Port gibt und auch Software die das unterstützt wird immer seltener.

Herr Fischl bietet einen auch fertig programmierten Bausatz an.

Um ohne Bootloader die Arduinosoftware zu programmieren, muss unter Tools der USBasp ausgewählt werden und statt auf Upload dann auf Upload mit Programmer klicken
Ideal wenn man andere Atmegas flashen möchte wie Atmega 85 oder 16 oder 32.

 

Selbstbauarduino mit ISP Anschluss

Dieses Bild zeigt die Verkabelung für den ISP  (In System Programmer). Den Resetknopf hatte ich auf den anderen Bildern vergessen.
Über den ISP-Anschluss kann man den Bootloader brennen oder den Arduino, der ja eigentlich ein Atmega328p ist in einer ander Programmierumgebung flashen.

 

Bootloader installieren und Fusebits setzen.

Bei einem  neuen Atmega ist werkseitig der interne Oszilator auf, glaub ich 2Mhz eingestellt. Die Anschlüsse für den Quarz können noch als IO Pins genutz werden. 16Mhz oder auch genau Oszillatorfrequenzen bekommt man nur mit einem Quarz hin.  Dazu muss die Konfiguration des Chips über die Fusebits geändert werden.
Um einen Bootload noch zu instllieren und vor überschreiben zu schützen sind weiteren Änderungen nötig.

Hier der AVR-Dude und eine Batchdatei zum download. Es ist das Programmiergerät von Fisch eingetragen.

Während der Installation muss der Quarz angeschlossen sein. Hinterher läuft der CHip nicht mehr ohne Quarz.

Hier die fertige Zeile zum setzen der Fuse und Lockbits :
avrdude -p m328p -c USBasp -U hfuse:w:0xda:m -U lfuse:w:0xff:m -U efuse:w:0x05:m -U lock:w:0x0f:m

Für die jüngeren, die den Umgang mit Kommandozeilen nicht mehr kennen gibt es für den AVR-Dude zusätzliche noch eine grafische Benutzeroberfläche. Das ist der Burn-O-mat. Hier downloaden.

 

rc522Mifare RFID zum lesen und beschreiben von ID Cards und Dongles.

Anschlüsse von Links nach rechts
SDA (SS), SCK, Mosi, Miso, Not used, GND, RST, 3.3V

Bei Arduino Uno, Nano, Micro wird MOSI an Pin 11, MISO an Pin 12, SCK  an Pin 13
SDA bzw. SS an  Pin 10 (Configurable) und RST an Pin 9 (Configurable) angeschlossen.
SS und RST sind konfigurierbar, die Pins müssen im Sketch angeben werden.

Wenn alles korrekt angeschlossen und die Library installiert ist, dann könnt ihr loslegen.
Als erstes am besten mit dem DumpInfo, da wird der Inhalt der Karte komplett über Seriallprint ausgegeben.
Achtung bei den beigefügten Karten und Dongles lässt sich die UID nicht ändern
Die Sketche zum lesen und schreiben funktionieren wie beschrieben.

Ich selbst habe ein Progrämmchen gemacht das man als Türöffner verwenden könnte.
Es wird eine voreingestellte UID mit der gelesenen verglichen. Der Status Grün oder rot über ein RGB LED angezeigt. Achtung SS und RST wie in meinem Sketch anschliessen oder Sketch ändern

Die Library und Testsketches könnt Ihr hier downlowden.

 

 

 

/*UID lesen und mit gespeicherter vergleichen
LEd blau=Leser wartet, Led Rot=vergeigert, Led gün =OK
getestet 03.2015*/
#include <SPI.h>
#include <MFRC522.h>

#define SS_PIN 9// so anschliessen
#define RST_PIN 5//so anschliessen
MFRC522 mfrc522(SS_PIN, RST_PIN);
byte soll[4]={
  0x81, 0xAA, 0x2C, 0x61};//UID für den Vergleich
byte inhalt[4];
int ledgruen=2;
int ledblau=3;
int ledrot=4;

void setup()
{
  Serial.begin(9600);
  Serial.println("Leser bereit !");
  Serial.println(" ");
  SPI.begin();
  mfrc522.PCD_Init();
  pinMode(ledrot, OUTPUT);
  pinMode(ledblau, OUTPUT);
  pinMode(ledgruen, OUTPUT);
  digitalWrite(ledblau, HIGH);
  digitalWrite(ledrot, HIGH);
  digitalWrite(ledgruen, HIGH);
}

void loop() {
  // Look for new cards
  digitalWrite(ledblau, LOW);
  digitalWrite(ledrot, HIGH);
  digitalWrite(ledgruen, HIGH);
  if ( ! mfrc522.PICC_IsNewCardPresent())
    return;

  // Select one of the cards
  if ( ! mfrc522.PICC_ReadCardSerial())
    return;

  // Show some details of the PICC (that is: the tag/card)
  Serial.print("Start ");
  digitalWrite(ledblau, HIGH);
  digitalWrite(ledrot, LOW);
 
  Serial.println();
  Serial.print("PICC type: ");
  byte piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
  Serial.println(mfrc522.PICC_GetTypeName(piccType));

  // Check for compatibility
  if (    piccType != MFRC522::PICC_TYPE_MIFARE_MINI
    &&  piccType != MFRC522::PICC_TYPE_MIFARE_1K
    &&  piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
    Serial.println("This sample only works with MIFARE Classic cards.");
    return;
  }
 
  for (byte i = 0; i < 4; i++) {
    //Serial.print(mfrc522.uid.uidByte[i],BIN);
    inhalt[i]=(mfrc522.uid.uidByte[i]);
  }  
  int open=0;
  for (byte i = 0; i < 4; i++) {
    if (soll[i] == inhalt[i] ){
      open =open+1;
    }
  }
  if (open==4){
    digitalWrite(ledrot, HIGH);
    digitalWrite(ledgruen, LOW);
  }
  else
  {
    digitalWrite(ledrot, LOW);
    digitalWrite(ledgruen, HIGH);
  }
  delay (1000);

}

 
 

Realtimclock

Mein zweites Selbstbauprojekt.

DS1307 Shield für Arduino

 

Anschluss siehe Bild, ganz einfach.
Pin 1 und 2 an den Quarz, Pin 3 Batterie +

Pin 4 Masse PIN 5 und 6 an Arduino wie im Bild. PIN 7 Clock out, hier nicht beschaltet. Pin 8 +5V ohne die geht es nicht.

Das Programm benutzt schon mein 3 Draht LCD Display.  Also bitte dem Libaryeintrag ändern. Oder ganz rausnehmen. Die Befehle sind dann von lcd.print auf serialprint zu ändern für eine Ausgabe auf den Seriallen Monitor. Weiterhin kann man auf <10 abfragen und dann bei den Zahlen eine Vorlaufnull erzeugen. Beispiele gibt es im Netz genug.

//Arduino 1.0+ Only
//Arduino 1.0+ Only

#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


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

void loop(){
  printDate();
  delay(1000);
}

/*void setDateTime(){

  byte second =      45; //0-59
  byte minute =      34; //0-59
  byte hour =       12; //0-23
  byte weekDay =     1; //1-7
  byte monthDay =    3; //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);
  lcd.print(month);
  lcd.print("/");
  lcd.print(monthDay);
  lcd.print("/");
  lcd.print(year);
  lcd.setCursor(0,2);
  lcd.print(" ");
  lcd.print(hour);
  lcd.print(":");
  lcd.print(minute);
  lcd.print(":");
  lcd.println(second);

}

Schaltplan :

DS1307 RTC an Arduino

 

Login Form