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):

 

 

Arducopter Usercode für z.B. WS2811 (Eigener Code) Flugmodus anzeigen

Grundidee:
Arduino Pro Micro als ws2811 Steuerung zur Vorder/Rückseitenbestimmung -> Vorne 3 Rote Leds und hinten 3 Blaue Leds mit kurzem Flash auf grün bei Flugmoduswechsel durch Ansteuerung vom MegapirateNG Arducopter.

Wenn man die Arducopter Firmware schon selbst kompiliert kann man durch die schon fertig integrierten Routinen sehr einfach eigenen Code einschleusen. Das wichtige hier is das der Code Lightweight bleibt damit andere wichtige Hauptroutinen zur Flugsteuerung  nicht verlangsamt werden.

(Mit dem WS2811 nur durch einen 2. Arduino, das wird hier das Beispiel)

Durch das entkommentieren der gewünschten USERHOOK Funktion in der APM_Config.h wird die Routine in der usercode.h aktiviert. Die Init sollte man auch entkommentieren da hier der Serialport RX1TX1 als uartD aktiviert wird.

Beispiel für einen Mediumloop@10Hz:

Jezt kann man in “usercode” in der Mediumloopfunktion eigenen Code integrieren, ich bringe hier einen Code ein der eine Unterfunktion für den Flugmodus abfragt. Im Prinzip gibt die Funktion nur aus welcher Flugmodus gewählt ist, bei einer Änderung des Flugmodus wird einfach das Wort “CHANGEMOD” über uartD gesendet. Der Clou is nun einen zB. Arduino Micro Pro oder Mini an diesen Port anzuschliessen.

Zuguterletzt noch ein kleines Beispiel das am Copter vorne 3 blaue Leds und hinten 3 Rote Leds eines WS2811 Verbundes immer leicht glimmen lässt und das dann bei ändern des Flugmodus kurz grün blinkt. Diese Funktion sollte mir erleichtern zu erkennen in welchem Flugmodus ich bin.

Arducopter Troubleshooting und bekannte Probleme bei der Installation

Board: AIOP V2 RCTimer

Fragen:
1. Das Accelerometer lässt sich nicht kalibrieren
2. das ESC lässt sich nicht wie beschrieben kalibrieren.

Antworten:
1. Hier muss man leider die Firmware Selbst kompilieren und vorher eine Zeile ändern.. durch Bauart des Boards oder des Bauteils liegen die Werte des Accelerometers zu hoch. Erstmal kurz gehalten: von der Arducopter Seite das Spezial-Arduino-IDE Package Downloaden .. die aktuelle Arducopter RC4 von Github clonen und in der AP_InertialSensor die x.xF Werte in Zeile 480 ähnlich diesem Code ändern:
if( accel_offsets.is_nan() || fabsf(accel_offsets.x) > 3.5f || fabsf(accel_offsets.y) > 3.5f || fabsf(accel_offsets.z) > 4.5f ) {success = false;}

2. ACHTUNG OHNE MONTIERTE PROPELLER!!! Man ändert über den MissionPlanner die Variable “ESC” auf 1 oder 2 (Bei 1 muss beim nächsten Schritt Throttle auf Voll stehen, bei 2 nichts weiter)..

Das geht in dem man auf Config/Tuning klickt und dann in der “Full Parameter List” über  “Find” , “ESC” eintippt und dann auf die null klickt und den neuen Wert hineinschreibt, zuguterletzt auf “Parameter Speichern”..

MPsettings

Jetzt kommt der eigentliche Trick.. Lipo anschliessen, in den Terminal und Connecten, wenn dort jetzt noch keine ESC Calibration Statusmeldung erscheint “Reboot” eintippen.. wenn die Motoren so oft gepiept haben wie der Akku Zellen hat Throttle Down und ein langer Piepton müsste zu hören sein. Fertig.