Schlagwort-Archive: Python

Dezentrale Temperaturerfassung mit Calliope mini in Python

Auf Grund der abweichenden Pinbelegungen zwischen BBC micro:bit und Calliope mini ist die Programmierung in Python gerade für I/O-Operationen nicht immer ohne Probleme. Die folgende Tabelle zeigt die Unterschiede:

nRF51822 micro:bit Calliope mini
P0.00 SCL P0
P0.01 P2 P1
P0.02 P1 P2
P0.03 P0 P3 (MIC)
P0.04 COL1 P4 (LED_C1)
P0.05 COL2 P5 (LED_C2)
P0.06 COL3 P6 (LED_C3)
P0.07 COL4 P7 (LED_C4)
P0.08 COL5 P8 (LED_C5)
P0.09 COL6 P9 (LED_C6)
P0.10 COL7 P10 (LED_C7)
P0.11 COL8 P11 (LED_C8)
P0.12 COL9 P12 (LEDC_9)
P0.13 ROW1 P13 (LED_R1)
P0.14 ROW2 P14 (LED_R2)
P0.15 ROW3 P15 (LED_R3)
P0.16 P16 P16 (TAST_B)
P0.17 BTN A P17 (TAST_A)
P0.18 P18 P18 (RGB LED)
P0.19 TGT nRST P19 (SCL)
P0.20 P20 P20 (SDA)
P0.21 MOSI P21 (BMX055 INT)
P0.22 MISO P22
P0.23 SCK P23
P0.24 TGT TxD P24 (TxD)
P0.25 TGT RxD P25 (RxD)
P0.26 BTN B P26 (Rx)
P0.27 ACC INT2 P27 (Tx)
P0.28 ACC INT1 P28
P0.29 MAG INT1 P29
P0.30 SDA P30
Zur Temperaturmessung möchte ich von folgendem Setup ausgehen.
Calliope Radio

Dezentrale Temperaturerfassung mit Calliope

 

Ein abgesetzter Calliope mini wird über ein Steckernetzteil am USB-Anschluss mit Spannung versorgt. Ein Temperatursensor LM35 erfasst die Temperatur im Bereich von 0 bis 150 °C. Hat man eine LM35 nicht zur Verfügung, dann kann anfangs auch mit dem internen Temperatursensor der CPU gearbeitet werden. Der Sensor sendet über die Radio-Verbindung die erfasste Temperatur an einen zweiten Calliope mini, der über USB mit einem PC verbunden ist.

Auf dem PC läuft ein Terminalprogramm (z.B. PuTTY) und erfasst die hier mit 9600 Baud seriell übertragenen Daten und bringt diese zur Anzeige.

Die beiden Calliope mini sind mit den folgenden Programmen zu flashen.

Sender:

# Measuring chip temperature on CPU & output to console
# works unchanged for micro:bit & Calliope mini

from microbit import *
import radio

# The radio won't work unless it's switched on.
radio.on()

while True:
 temp = temperature() - 3 # offset to ambient temperature
 display.scroll(str(temp)+" *C")
 radio.send(str(temp))
 sleep(60000) # sleep a minute

Bei Einsatz eines LM35 Temperatursensors ist das Erfassen der Temperatur anzupassen:

temp = pin1.read_analog() * 330 / 1024

Der Ausgang des LM35 ist, wie in der Abbildung gezeigt, mit P2 am Calliope mini zu verbinden (sh. auch in der Tabelle oben).

Empfänger:

# Receiving chip temperature from a second board & output to console
# works unchanged for micro:bit & Calliope mini

from microbit import *
import os
import radio

uart.init()
uart.write(os.uname().machine + "\r\nGet chip temperature by radio connection\r\n")

# The radio won't work unless it's switched on.
radio.on()

while True:
 # Read any incoming messages.
 temp = radio.receive()
 if str(temp) != "None":
 display.scroll(str(temp)+" *C")
 uart.write("Received chip temperature = "+str(temp)+" *C\r\n")
 sleep(1000)

Die Reichweite der Radio Verbindung des Calliope mini liegt bei ca. 20 m, so dass dem Test im Wohnraum wenig Grenzen gesetzt sind.

 

Calliope in Python programmieren

Will man den Calliope mini nicht im Schulkontext verwenden, dann bietet sich, wie beim micro:bit, die Programmierung in Micro-Python an.

Einen Editor findet man beispielsweise unter http://python.microbit.org/editor.html. In diesen Editor pastet man dann einfach den Python-Quelltext, wie z.B. das folgende Programmbeispiel zur Temperaturmessung.

# Measuring chip temperature on Calliope mini & output to console
from microbit import *
import os

uart.init()
uart.write(os.uname().machine +" measuring chip temperature\r\n")

while True:
 temp = temperature() - 3 # offset to ambient temperature
 display.scroll(str(temp)+" C")
 uart.write("Calliope mini chip temperature = "+str(temp)+" C\r\n")
 sleep(5000)

Nach dem Compilieren kann das  erstellte File microbit.hex einfach in das Laufwerk kopiert werden, als das sich der Calliope mini beim Anschluss über USB meldet.

Zum Beobachten der seriellen Ausgaben kann bspw. mit PuTTY auf das betreffende COM-Port zugegriffen werden. Die Baudrate beträgt hier 9600 Bd. Die LED-Matrix zeigt die Ausgabe als Laufschrift an.

Screenshot

Zugang zu den verschiedenen Ressourcen des eingesetzten Mikrocontrollers erhält man über die micro:bit Python API.

Abgesetzter Temperatursensor mit micro:bit radio

Micro:bit ist zwar BLE tauglich, doch unter Python reichen die Ressorcen für den BLE-Stack nicht aus und es bleibt die micro:bit radio Verbindung.

Zur abgesetzten Temperaturmessung kann ein micro:bit als Sensorknoten und eine weiterer als Empfängerknoten genutzt werden. Die Message des Sensors wird hier als Broadcast versendet.

Das Python-Programm des Sensors ist:

# Measuring chip temperature on micro:bit & output to radio
from microbit import *
import radio

# The radio won't work unless it's switched on.
radio.on()

while True:
 temp = temperature() - 3 # offset to ambient temperature
 display.scroll(str(temp)+" C")
 radio.send(str(temp))
 sleep(5000)

Das Python-Programm des Empfängers ist:

# Receiving chip temperature from a micro:bit sensor node & output to console
from microbit import *
import os
import radio

uart.init()
uart.write(os.uname().machine +" get chip temperature by radio connection\r\n")

# The radio won't work unless it's switched on.
radio.on()

while True:
 # Read any incoming messages.
 temp = radio.receive()
 display.scroll(str(temp)+" C")
 uart.write("micro:bit chip temperature = "+str(temp)+" C\r\n")
 sleep(1000)

 

 

BBC Micro:bit

Micro:bit ist ein für Ausbildungszwecke entwickelter Mikrocontroller mit Features, die diesen Controller auch für Prototypen-Entwicklungen u.a. interessant machen. Hier sind die Retails zu diesem Controller zu finden.

Die technischen Spezifikationen sind:

  • Nordic Semiconductor nRF51822 Bluetooth Low Energy & 2.4GHz Wireless SoC (32-bit ARM® Cortex™ M0 CPU mit 256kB Flash und 16kB RAM)
  • Bluetooth Smart Antenne
  • microUSB Anschluss (Programmdownload, Console)
  • LiPo-Anschluss
  • 25 LEDs, 2 Taster
  • 20 Pin Edge Connector
  • Accelerometer, Compass

Programmierbar in

  • JavaScript-Blocks-Editor (PXT)
  • microPython

MicroPython Programmbeispiel

# Measuring chip temperature on micro:bit & output to console
from microbit import *
import os

uart.init()
uart.write(os.uname().machine +" measuring chip temperature\r\n")

while True:
 temp = temperature()
 display.scroll(str(temp)+" C")
 uart.write("micro:bit chip temperature = "+str(temp)+" C\r\n")
 sleep(5000)

 

 

pycom LoPy – erste Schritte mit ESP32

Mit dem LoPy habe ich nun nach dem WiPy das zweite Controller-Board von pycom in Betrieb genommen. Die Inbetriebnahme gestaltet sich nach der pycom Doku recht problemlos.

pycom_boards

Aus der Pymakr IDE heraus habe ich über USB-Serial mit den Boards kommuniziert. Ganz wichtig ist ein gelegentliches Firmware Update, da die Firmware selbst noch spürbar in Entwicklung ist.

Ich hatte folgende Situation vorgefunden, die jeder mit seinem System durch die folgenden Schritte nachvollziehen kann:

>>>import os
>>>os.uname()

WiPy:

(sysname='WiPy', nodename='WiPy', release='0.9.2.b2', version='7713d55 on 2016-10-28', machine='WiPy with ESP32')

LoPy:

(sysname='ESP32', nodename='ESP32', release='0.9.0b', version='8785822 on 2016-10-06', machine='LoPy with ESP32')

und musste feststellen, dass nicht alle von mir für erste Tests benutzten Funktionen erwartungsgemäß funktionierten. Nach dem Firmware-Update zeigte sich die Situation dann folgendermaßen:

WiPy:

(sysname='WiPy', nodename='WiPy', release='0.9.6.b1', version='v1.8.6-40-gd10463e on 2016-11-25', machine='WiPy with ESP32')

LoPy:

(sysname='LoPy', nodename='LoPy', release='0.9.6.b1', version='v1.8.6-40-gd10463e on 2016-11-25', machine='LoPy with ESP32')

Das Firmware-Update war also erforderlich und erfolgreich.

Mit ein paar einfachen Files habe ich meine Tests begonnen. Alles weiteren Experiment werden auf GitHub abgelegt.

Die Terminal-Ausgabe der Scripts hello.py, blink.py und TMP36.py sind im folgenden Screenshot zu sehen.

output

Weitere Infos und Programmbeispiele sind hier zu finden.