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}"
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.
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);
}
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
}
}
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 Widerstand 330Ohm 1 Widerstand 470 Ohm 1 Widerstand 150 Ohm 1 Wannenstecker 10pol. |
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.
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.
Ganz einfach mit einem stabilisierten
|
Hier kann man mit einem 9-15VNetzteil rein. Es ist eine Gleichrichtung und ein 5V Regler verbaut. 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.
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.
|
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
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.
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.
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.
Mifare 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);
}
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);
}