Arduino Taster Entprellung

Entprellung eines Tasters mit den Zeitoptionen Mindeste Druckzeit, Entprellzeit, Abtastrate (indirekte Entprellung).

 

MCP23017 Deustch

MCP 23017 Kurz und Bündig.
Allgemeine Register.

IODIR
Direction Register, bestimmt ob ein Pin Input oder Output ist.
1=Input, 0=Output

IPOL
Polaritätsregister, bestimmt die Polarität/Invertierung eines Pins
1=Invertiert, 0=nicht Invertiert

GPIO
InputOutput Register,
LESEN: Eingänge einlesen.
SCHREIBEN: wird ans OLAT Output Register weitergeleitet.
0=LOW, 1=HIGH

OLAT
Output Latch Register,
SCHREIBEN: Setzt die Ausgänge der als Ausgang definierten Pins.
LESEN: Gibt den zuletzt gesetzten Wert zurück.
0=LOW, 1=HIGH

GPPU
Pullup Register, aktiviert den Pullup am Pin.
1=HIGH, 0=LOW

Interrupt Register Konfiguration

Kleine Falle:
Die Interruptverwendung beinhaltet 3 Register. GPINTVEN, DEFVAL, INTCON welche alle 3 gesetzt werden müssen.
Wenn der Interrupt für einen Pin mit GPINTVEN aktiviert wird, entscheidet INTCON die Datenquelle des Signalvergleichs.
Wenn INTCON 0 ist, wird der Pin mit dem in DEFVAL gesetzten Signal 0/1 verglichen,
sollte INTCON 1 sein wird auf den letzten Pin Status verglichen.

INTERRUPT LOGIK:

Wenn ein Interrupt generiert wird werden die aktuellen Pin Werte in das INTCAP Register gesichert. Der Interrupt wird gelöscht wenn das LSB Byte beim Lesen der Register GPIO oder INTCAP übertragen wurde.

GPINTEN
InterruptOnChange Event Register, Aktiviert den Interrupt für einen Pin.
1=Aktiv, 0=Inaktiv

INTCON
Interrupt Control Register, bestimmt die Quelle der Interrupt On Change Quelle
1= Vergleich auf das DEFVAL Register,0= Letzten Status des Pins

DEFVAL
Default Value Register, bestimmt den Standard Vergleichswert des Pins wenn INTCON=1
1= HIGH, 0=LOW

Interrupt Register Status/Information

INTF
Interrupt Flag Register, beinhaltet den Status der Interruptauslösung.
1=Interrupt ausgelöst, 0=Kein Interrupt vorhanden

INTCAP
Interrupt Capt Register, Speichert den Wert des letzten Pin Status bei Interrupt Auslösung.
1=HIGH, 0=LOW

Allgemeine Konfiguration

IOCON
Zwischen Port A und B geteiltes Konfigurationsregister

Bit7: BANK, entscheidet die Sortierung der IO Register,
1=Zuerst alle A Register, danach alle B register
0= Beispiel, GPIOA,GPIOB,IPOLA,IPOLB

Bit6: MIRROR,
1=A und B teilen sich beide Interrupt Pins INTA und INTB
0=INTA ist für A und INTB für B

Bit5: SEQOP, Sequentielles Lesen/Schreiben
1= Deaktiviert
0=Aktiviert

Bit4: DISSLW, i2C Slew Rate Clock Stretching Ein/Ausschalten
1=Deaktiviert
0=Aktiviert

Bit3: HAEN: Address Pins aktivieren/Deaktivieren
1=Aktiviert0=Deaktiviert

Bit2: ODR Konfiguration INTA, INTB Open-Drain Option
1=Open-Drain
0=Aktiver Treiber

Bit1: INTPOL Interrupt PIN Polarität, Invertiert die Interrupt Pins.

Bit0: Nicht benutzt.

Einfache Genaue Messungen mit Mikrocontrollern (Teil1)

Referenz-Signal

Als erstes benötigen wir ein Referenz-Signal, wozu brauchen wir das überhaupt?

Die Mikrocontroller werden üblicherweise von Quarzen getaktet, hier in den Beispielen nehmen wir ein 16Mhz Standard an. Normalerweise benötigt man die normalen Quarze, diese reichen für normale Taktungen und Kurzzeitmessungen im Nano/Mikrosekunden Bereich auch aus. Das eigentliche Problem tritt erst auf wenn man Sekunden oder sogar Stunden auf eine Millisekunde genau messen möchte, hier addieren sich die Messfehler dann auf.

Aber wieviel ist das?

Dazu benutze ich ein GPS-Empfänger für knapp 8€, dieser bekommt durchgehend von allen Empfangenen Satelliten ein Mikrosekunden Zeitstempel in Weltzeit mit der genauigkeit einer Atomuhr (Die wirklich in jedem Satellit vorhanden ist).

Durch eine eigene hohe Taktung kann das Empfängermodul aus den Empfangenen Daten der Satelliten die Lokalzeit in Millisekunden fast Nanosekundengenau berechnen. Wir machen uns zum Vorteil das jedes Modul ein PPS “Pulse Per Second” Impuls an einem Pin ausgibt! Bei einem NEO-6M Modul ist dieser Impuls auf 60Nanosekunden genau Langzeitsynchronisiert, das bedeutet das solange wir diesen Puls Empfangen und zählen .. der Abstand der gezählten Impulse den Sekunden entsprechen und das auf 60ns genau.

Praktisch heißt das, wir können mit einem Mikrocontroller als Referenz andere Impulse zwischen zwei PPS Impulsen zählen und können so auf 30-60ns Genau Frequenzen im Mhz Bereich auf 1Hz genau messen.

 

Beispiel:

Man kauft sich ein fertiges Breadboard mit angegebenem 16MHz Resonator/Quarz.. Dank der Messung mit dem PPS Impuls stellt man dann fest das dieser im Schnitt nur 15,95MHz und das auch noch schwankend taktet. Das bedeutet immerhin das für den Mikrocontroller 1 Sekunde nur 997 Millisekunden lang ist und dieser nach 20 Minuten und 1200 Sekunden meint es wäre fast 4 Sekunden später usw usw!

Eine schlechte Stopuhr gegen eine Digitale Armbanduhr mit genauen Sekunden.. dabei hat man sich das ja so gut ausgedacht..

 

 

 

 

 

RPi Starwars Uhr mit Internetradio

43176914545393888441054441454726041099

Eine kleine RPi-Zero (5€ Minicomputer) Uhr die die aktuelle Uhrzeit in der Mitte anzeigt und bei Wechsel wie im StarWars Vorspann raus und wieder einfliesst.

Wenn man Internetzeit als Sync benutzen möchte kann man auch gleich ein Internetradio daraus bauen, ansonsten bieten sich Diverse RealTimeClocks an.

Das ganze basiert auf einem Headless-Linux (ohne HDMI Bildschirm und Grafik) Debian Wheezy mit installiertem Java8 und einer JavaFX Animation. Das Elektronik SPI-Interface Display ist über die IOs mit dem FBTFT Framebuffer Treiber eingebunden.

Als Internetradio App habe ich MPD ohne Grafikoberfläche gewählt, dafür gibt es viele Apps in den Android und IPhone Stores.

  • Basiert auf Rapbian Wheezy ohne DesktopManager, deinstalliertem LightDM, Java8FX Engine schreibt JavaFX direkt in den Framebuffer.

    Gute Anleitung als Grundlage, im Endeffekt einfach zu lang http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/RaspberryPiFX/raspberryfx.html

    EDIT /boot/config.txt ähnlich:

     

  • 2

    Installiere fbcp um den Main Framebuffer zum LCD-Framebuffer zu kopieren.

  • 3

    Erstelle start.sh zum Beispiel:

     

    Update Kernel mit rpi-update:

  • 5

    Downloade Java8 JDKu71 für ARM und extrahiere die Dateien. Exportiere gegebenfalls Deinen Javapath  EXPORT PATH zu opt/jdkXXX/bin

  • 6 Kompiliere das StarWars JavaFX Script und kopiere das Hintergrundbild StarWars.jpg in den gleichen Ordner /Projektpfad :
  • 7

    Die Uhr mit dem Raspi starten:

     

 

 

Rpi Headless Osmc, SPI Display mit fbtft im Framebuffer beschreiben RGB 65k

Einfaches Snippet das einen im Binärfile hinterlegten BMP Font(RGB565) im Framebuffer scrollt. Jeder Buchstabe hat in der Datei seinen Startblock Ascii-Code*Width*Heigth und jede Fontgröße wiederum ihren Startblock. (Gepackt mit einem kleinen Tool für Grafiken in SPI-Flashes)

mywindows

Als Grundlage installiert man rpi-update mit integriertem fbtft und aktiviert SPI.

Dann kann man zB. für das kleine HY28B display folgend Treiber laden:

modprobe dma fbtft

modprobe fbtft_device name=hy28b fbtft_device.speed=10000000 fbtft_device.rotate=90 fbtft_device.mode=3

 

 

APM, Arducopter Mehrkanal Pid tuning.

Dieses Projekt nutzt einen Arduino mit nrf24l01 als Empfänger für einen Sender mit 3 Potis (Siehe Bild) um die Potistellungen in fertige PID Werte umzuwandeln und als I2C Slave über den USERCODE des Arducopter zur Verfügung zu stellen.

7272241428662241465

Hier nur mit cc3d, ein Arduino Empfänger über i2C am FCU-Board mit 3 Kanal Sender:

Potiwerte via nrf24l01 in ppm[] als i2c-Slave request Antwort

Usercode.pde Related Code

 

 

In der Usercode Datei wird sobald im Missionplanner ein beliebiges CH6 Tuning gesetzt wird alle 3 Sekunden beliebig viele über Poti gesteuerte PID-Werte gesetzt.

Codebeispiele:

 

cc3d PID TUNING BOX

Dieses Projekt nutzt den 2ten Receiver-Input Anschluß eines cc3d Atom zur Einspeisung von PID-Tx Kanälen. An meinem cc3d nutze ich 6PWM Inputs für meine Fernsteuerung, der trick ist den zweiten unbenutzen PPM Input über 2 Arduinos und eine beliebige Funkstrecke als “TX-Pid Bypass” zu nutzen.

Anleitung: https://hackaday.io/project/5212-diy-3channel-ppm-quadcopter-calibration-box

So sieht dann das Ergebnis aus:

7272241428662241465

Hier sieht man einen eigenen ProMini Clone mit nrf24l01 Platine und ppm Output am Flexiport. Dazu noch den Sender mit 3Potis der die Werte in 1100-1900 sendet.

Erklärungsvideo:

auf Wunsch kann ich das Projekt zur Weitergabe Beautifiern!

Infrarot und Arduino Codes, Pronto, Anymote und Scrutinizer

Wer einfach mal auf die schnelle mit einem Arduino (Nano,Leonardo,Uno, MiniPro mit FTDI Adapter) ein Infrarotsignal auslesen möchte und keine Lust auf viel hin und her hat dem ist hier geholfen. Mit dem netten Tool IRScrutinizer ist alles rund um Infrarot möglich. Das Tool benutzt diverse Hardware als IR-Bridge.

Anbei ein Link zu einem 1,2GB VMPlayer Image das von selbst funktioniert, Arduino-IDE, Scrutinizer,Libs und Java sind vorkonfiguriert und installiert!  https://philipp.kuhrs.eu/fedora.rar

Ganz einfach:

1. Image Starten

2. Als test mit PW test einloggen

3. Arduino-IDE Starten und das Beispiel Girslite auf den Arduino hochladen

4. IR LED und IR Empfänger wie folgt anschliessen:

SenderPin CapturePin
Uno/Nano (ATmega328P) 3 8
Leonardo/Micro (ATmega32U4) 9 4
Mega2560 (ATmega2560) 9 49

5. Über den Desktop Link IRTool den Scrutinizer starten, nach dem flashen ist der Arduino und Scrutinizer auch in Windows lauffähig.

Wenn alles geklappt hat muss man nur noch Arduino als CapturingHW und Sender HW einstellen und noch je nachdem ob man Lesen/Senden möchte im jeweiligen Tab mit Open Verbinden..

 

Trick für automatische Benachrichtigung bei DNS Change

Wer hat nicht schonmal A-Records auf eine andere IP geändert oder gesetzt und lange gewartet..

Die folgenden 2 Scripte für Windows und Linux checken über Ping die IP des Hostnamens auf Änderung zur neuen IP und versenden eine Email mit einem Googlemail Account.. auf vielen NAS geht das in Linux bei Konfigurierung eines SMTP Relay über sendmail (wie man den jeweiligen Agent auf Google einstellt gibts genug Anleitungen ) und bei Windows muss die kleine sendmail.exe (von http://caspian.dotconf.net) in das Scriptverzeichnis gelegt werden.

Windows Batch Datei:

 

Linux Shell Script (nachricht.txt muss angelegt werden, und dann ein cronjob mit zB. /usr/bin/sh /Pfad/check.sh angelegt werden):