Author Archives: ghp_Ar7p

Capacitive Sensor for Scratch

[german]
Using an oscillator and a microcontroller atmega328 it is possible to build a fill level measurement for scratch, based on a capacitive sensor.

The controller is measuring the frequency of the oscillator. Data are transmitted by SPi to raspberry. A scratchClient adapter is calculating the frequency and forwarding them to scratch.

The video shows the setup on breadboard. Left side is the oscillator, in the middle is the controller and then the connection to raspberry. The sensor is build from a stripe of copper coated epoxy, separated in the middle. As air has different electrical characteristics than water, the capacity of the capacitor changes close to water. An oscillator, using this capacitor, will change its frequency.

atmel_Steckplatine

The scratchClient uses the adapter ‘Atmel328_ADC_Adapter’. The firmware is the same as for the ADConverter  AD-Wandler.

The oscillator ist standard TLC555, the cmos cousin of popular 555. The frequency range is in the example 13,5kHz in dry air and 9,6kHz with water in glass.

Frequency measurement is done in controller on 10ms or prox 72 periods. The controller is averaging the last 16 measurements. The ‘open’ construction causes some disturbances, causing sporadic measurement failures.

Update history:
2014-04-01 Fixed connections of LED

Kapazitiver Sensor für eine Füllstandsanzeige

[english]

Mit einem Oszillator und einem Microcontroller ATMega 328 kann ein Füllstandsanzeiger für Scratch gebaut werden.

Der Microcontroller ermittelt die Frequenz des Oszillators. Die Daten werden über SPI an den RaspberryPi gegeben. Der Scratch Adapter wertet diese aus und gibt sie an scratch weiter.

Der Film zeigt den Aufbau auf dem Steckbrett. Das enthält den Oszillator links, in der Mitte den Controller und dann die Verbindung zum RPi. Der Sensor ist ein Streifen einer Epoxydplatine. Die Kupferschicht wurde längs unterbrochen, so dass die zwei Platten eines Kondensators entstehen. Da Luft andere Eigenschaften als z.B. Wasser hat, verändert sich die Kapazität des Kondensators in der Nähe von Wasser. Ein Oszillator, der diesen Kondensator verwendet, wird seine Frequenz verändern.

atmel_Steckplatine

Der scratchClient benutzt den Adapter ‘Atmel328_ADC_Adapter’. Die Firmware des Controllers ist dieselbe wie für den AD-Wandler.

Der Oszillator ist ein TLC555, die CMOS-Ausführung des bekannten 555. Zusätzliche Bauteile sind 2 Widerstände 1M Ohm und ein Kondensator 100nF. Frequenzbereich ist im Beispiel etwa 13,5kHz ohne Wasser im Glas und 9,6kHz mit Wasser.

Die Frequenzmessung erfolgt im Microcontroller über ca 10ms bzw 72 Signalperioden. Die Werte werden auf dem Controller mit den letzten 16 Werten gemittelt. Wegen des offenen Aufbaus gibt es einige Störgrössen, die ohne Mittelwertbildung/Filterung sporadische Ausreisser produzieren.

Update history:
2014-04-01 Fixed connections of LED

Atmel 328-Prozessor als AD-Wandler für Raspberry Pi

[english]

Siehe auch
MCP3202-AD Wandler am Raspberry PI
ADS1015 als AD-Wandler am Raspberry Pi
Arduino UNO, NANO connected to Scratch

Atmel 328-Prozessor als AD-Wandler für Raspberry Pi

Der Microcontroller ATmega328P im DIL-Gehäuse kann auf dem Steckbrett in Betrieb genommen werden.

Der Microcontroller hat viele eingebaute Funktionen, wie z.B. AD-Wandler, Timer, SPI und anderes mehr.
Dieser Microcontroller ist im Hobbybereich sehr bekannt, da die Arduino-Boards mit diesem Microcontroller arbeiten.
Der AD-Wandler des Microcontrollers hat eine ausreichende Auflösung mit 10 Bit und es können bis zu 5 Eingänge angeschlossen werden. Damit kann er als Ersatz für einen AD-Wandlerbaustein benutzt werden.

Der Controller ist einfach an den Raspberry Pi anzuschliessen und sein Programm kann vom RPi aus aufgespielt werden. Wie der Baustein programmiert wird soll hier nicht beschrieben werden. Das benötigte Programm ist bereits übersetzt in den Beispielen enthalten.
Die Kosten für den Prozessor sind mit einigen Euro etwa so hoch wie für einen AD-Wandler.

Nachteil ist die etwas komplizierte Inbetriebnahme. Die ist deshalb so lang geworden, da viele einzelne Schritte und Überprüfungen aufgenommen wurden.

Das interne Programm des 328-Microcontroller ist in den Beispielen enthalten.

Das Programm kann zwei AD-Kanäle auslesen und eine Leuchtdiode ansteuern. Weitere Funktionen sind in Planung, wie ein Frequenzmesser, ein Anschluss für eine Infrarotfernsteuerung und Drehencoder.

Das Programm des Microcontrollers kann mit dem Raspberry in den Controller übertragen werden. Es ist also kein extra Programmiergerät erforderlich.
Voraussetzung ist, dass der Microcontroller den internen 8MHz RC-Oszillator aktiviert hat. Das ist bei fabrikneuen Microcontrollern der Fall.
Die Grundeinstellung des Microcontrollers, also auch die Steuerung der Oszillatoren wird über ‘Fuses’ eingestellt. Damit kann man den interen Oszillator aktivieren oder es werden Quartz-Oszillatoren oder eine externe Taktquelle aktiviert. Das Problem ist, dass ohne aktiven Oszillator das Programmieren mit dem RPi nicht funktioniert.
Falls man einen bereits programmierten Prozessor erhält, dann kann dieser den internen Oszillator abgeschaltet haben. In diesem Fall funktioniert bereits das Auslesen der ‘Fuses’ nicht.
Dann braucht man entweder ein spezielles Programmiergerät oder muss den GPIO#4 als Taktquelle aktivieren. Eine Anleitung dazu ist am Ende des Artikels zu finden.

Einkaufsliste

  • ATmega 328 P-PU (DIL-Gehäuse)
  • Steckbrett
  • Präzisionsfassung 28 pol, DIL 28 pol, 0.3 breit. Die Fassung ist für den Prozessor, damit die Beinchen nicht so leicht verbiegen. Fassung auf verbogene Kontakte kontrollieren (vorsichtig gerade biegen) und ins Steckbrett einsetzen. Den 328 in die Fassung einsetzen. Die Füsse des Prozessors sind ab Fabrik nicht genau parallel ausgerichtet. Vorsichtig auf einer glatten Platte ausrichten.
  • Leuchtdiode. Der längere Anschluss ist die Anode und wird mit ‘+ 3.3V’ verbunden.
  • Widerstand 1kOhm
  • Kondensator, Keramik 100nF, min 10V
  • Trimmpotentiometer zum Test
  • Steckbrücken Buchse-Stecker, 7 Stück oder 8
  • Kabelbrücken fürs Steckbrett

Inbetriebnahme

Aufbau der Verkabelung, Programmierung des Prozessors und Aktivieren der scratchClient-Software.

Elektrischer Aufbau

Strom des Rpi abschalten.

Prozessor auf dem Steckbrett aufbauen.

atmel_Steckplatine

VCC des Prozessors wird aus 3.3V des Raspberry versorgt.
SPI-Verbindung MISO, MOSI, SCK und SS an CS0 des RPI.
RESET des Prozessors Pin 1 an GPIO24
LED mit Serienwiderstand 1kOhm von Port PB1, Pin 15.
ADC-Eingänge am atmega328 sind ADC0 und ADC1, Pin 23, 24.

Prozessor im Sockel

So sieht der Controller im Sockel auf dem Steckbrett aus.

 

Programmiersoftware auf dem Rpi installieren

sudo apt-get update
sudo apt-get upgrade -y
sudo apt-get install python-dev pip
sudo pip install spidev intelhex

Den SPI-Treiber aktivieren. Der ist über raspi-config zu starten, (enable SPI).
Oder über
sudo modprobe spi_bcm2708

Programmiersoftware in /home/pi kopieren

Das Archiv laden und auf dem RPi in /home/pi speichern und auspacken.

tar xzvf program_328.tar.gz

Überprüfen der Hardware und der Programme

Die folgenden Schritte prüfen, ob die Verkabelung korrekt ist und die Programmierung des Controllers möglich ist.

Fuses auslesen

cd ~/program_328
sudo python src/program.py -rf

Die Ausgabe sollte folgendermassen aussehen

PROGRAMMING_READ_CALIBRATION_BYTE b0 10110000
 PROGRAMMING_READ_EXTENDED_FUSE_BITS ff 11111111
 BODLEVEL0 1
 BODLEVEL1 1
 BODLEVEL2 1
 PROGRAMMING_READ_FUSE_BITS e2 11100010
 CKSEL0 0 ENABLED
 CKSEL1 1
 CKSEL2 0 ENABLED
 CKSEL3 0 ENABLED
 SUT0 0 ENABLED
 SUT1 1
 CKOUT 1
 CKDIV8 0
 PROGRAMMING_READ_FUSE_HIGH_BITS d9 11011001
 BOOTRST 1
 BOOTSZ0 0 ENABLED
 BOOTSZ1 0 ENABLED
 EESAVE 1
 WDTON 1
 SPIEN 0 ENABLED
 DWEN 1
 RSTDISBL 1
 PROGRAMMING_READ_LOCK_BITS ff 11111111

Wenn es Fehlermeldungen gibt (Device not in sync), dann liegt ggf ein Schaltfehler vor oder der Prozessor ist bereits mit unpassenden Fuses programmiert.
Dann erst mal nicht weitermachen und Verkabelung überprüfen. Wenn diese stimmt, dann externen Takt anschliessen.

Aktuelles Programm auslesen

Wenn die Ausgabe stimmt, dann kann man versuchen das aktuelle Programm auszulesen. Das ist bei einem neuen Prozessor noch leer. Hier dient das zu einer weiteren Überprüfung der Kommunikation.

cd ~/program_328
sudo python src/program.py -r

Die Ausgabe sollte wie folgt aussehen

python src/program.py -r
 ('read', 'out.hex')
 programming_readCode
 programming_enable
 ('PROGRAMMING_ENABLE', [172, 83, 0, 0])
 (0, [255, 255, 83, 0])
 programming_enable end
 programming_disable
 programming_readCode ende
 ok

Test-Programm in den Controller laden

Sind die bisherigen Schritte erfolgreich, dann kann man das erste Testprogramm in den Prozessor laden. Es sollte die LED blinken lassen.

cd ~/program_328
sudo python src/program.py -p 328/steckbrett_328_blink.hex

Jetzt sollte die LED langsam blinken.

Fuses für Oszillator programmieren

Der Microcontroller läuft bisher mit dem internen Oszilator, aber durch einen Teiler wird die Frequenz auf 1MHz heruntergesetzt. Der Teiler kann mit den Fuses abgeschaltet werden und der Controller läuft dann mit 8MHz, was bei 3.3V Betriebsspannung das Maximum ist für diesen Controller.

Die Fuses nur programmieren, wenn es bei den vorherigen Schritten keine Fehler gab und die LED auch blinkt.

cd ~/program_328
sudo python src/program.py -wf

Das Blinken hört kurz auf, und sollte dann deutlich schneller wieder anfangen, 5 mal die Sekunde.
Jetzt der Oszillator konfiguriert  und der Controller läuft mit 8MHz.

Anwendungsprogramm in den Controller laden

Jetzt kann das eigentliche Anwendungsprogramm geladen werden. Es sorgt für regelmässiges Auslesen der AD-Werte ADC0, ADC1.
cd ~/program_328
sudo python src/program.py -p 328/steckbrett_328.hex

Nach dem Programmieren oder Einschalten des RPI mit dem Steckbrett sollte die LED 5 mal leuchten.

Anwendungsprogramm – Testprogramme

Die LED blinken lassen, lange hell und kurz dunkel.
cd ~/program_328
sudo python src/test_blink.py

Auslesen der Version des 328-Programms
cd ~/program_328
sudo python src/test_get_version.py

Die Anzeige sollte ’93 09′ sein; die zweite Zahl kann höher sein.

Auslesen der adc_0-Werte
cd ~/program_328
sudo python src/test_adc_0.py

Scratch-Verbindung

Wenn die Tests für die Anwendungssoftware funktionieren, kann die Verbindung mit Scratch in Betrieb genommen werden.

cd ~/scratchClient
sudo python src/scratchClient.py -config config/config_adc_atmel328.xml

Die Konfiguration kann über Parameter angepasst werden und erlaubt das An-Abschalten der AD-Kanäle. Die Referenzspannung kann 3.3-V sein oder die interne 1.1V-Referenz.
Die 1.1V-Referenz kann z.B. mit einem Temperatursensor TMP036 benutzt werden.

Die 3.3V-Referenz ist ideal, wenn Potentiometer ausgelesen werden.

Die Werte der AD-Wandler werden als ‘adc_0’ und ‘adc_1’ an Scratch geschickt, Wertebereich 0..1023.
Befehle von Scratch an den Controller sind ‘led_off’, ‘led_on’.

SPI-Kommunikation zwischen RPi und Controller

Der Controller muss alle Befehle, die vom RPi gesendet werden überprüfen und die entsprechende Aktion ausführen. Der Controller muss das so schnell erledigen, dass die nächste Anfrage des RPi schon die korrekten Daten erhalten kann.

Die Übertragungsrate kann deshalb nur relativ langsam sein mit 240kHz. Das ist aber bei der Kommunikation mit Scratch kein Problem.

Trotz dieser Beschränkungen wurde SPI gewählt, da diese Verbindungen bereits zum Programmieren des Controllers vorhanden sind.

Anhang: GPIO#4 des RPi als Taktgenerator für den 328

Der GPIO#4-Pin kann als Taktausgang konfiguriert werden. Das dafür notwendige Programm ist im bin/-Verzeichnis enthalten, Es basiert auf Code von guzunty.org.

GPIO#4 mit den XCLK-Eingang des Controllers verbinden.  Dann das Programm bin/gz_clock_1.92MHz starten.

cd bin
chmod +x gz_clock_1.92MHz 
sudo ./gz_clock_1.92MHz

Die Ausgabefrequenz ist ca 2MHz.

Während das Programm läuft, das Auslesen und Schreiben der Fuses ausführen.
Dann diese Verbindung wieder trennen.

Update history:
2014-04-01 Fixed connections of LED

ADS1015 als AD-Wandler am Raspberry Pi

Siehe auch
Atmel 328-Prozessor als AD-Wandler für Raspberry Pi
MCP3202-AD Wandler am Raspberry PI
Arduino UNO, NANO connected to Scratch

Die Firma adafruit vertreibt eine kleine Platine, die einen 12-Bit ADC ADS1015 enthält. Dieser hat eine eigene Referenzspannung und einen einstellbaren Verstärker. Bis zu 4 Analogkanäle können angeschlossen werden. Der nutzbare Spannungsbereich ist 0 bis 3.3V, da im Beispiel die Platine mit 3,3V betrieben wird.

Diese Platine kann zum Anschluss von analogen Sensoren mit scratch benutzt werden.

Benötigt: Steckbrett, Lötkolben, Lötzinn, Steckkabel Buchse/Stecker und einige kurze Drahtstücke. Potentiometer 2.2kOhm (hier geht auch bis 10kOhm) als Beispiel für einen Sensor.

aufbauUm die Platine an den RPi anzuschliessen ist ein Steckbrett nötig. Die Platine wird ohne montierte Steckleiste ausgeliefert, diese muss selber angelötet werden. So sieht das dann aus.

 

 

Die Verkabelung ist hier aufgezeichnet.

ads1015_bb

Hier ist das Potentiometer an den Eingang A2 angeschlossen. Es kann jeder Eingang verwendet werden, das muss dann aber auch in der Konfiguration des scratchClient berücksichtigt werden.

Vorbereitung (siehe auch die Installationsanweiung in der Dokumentation des scratchClient):

sudo apt-get python-smbus i2c-tools
sudo modprobe i2c-bcm2708
sudo modprobe i2c-dev

Die ‘i2c-tools’ sind eine Sammlung von Werkzeugen, um den i2c-Bus zu prüfen und Geräte anzusprechen. Nach der Verkabelung kann geprüft werden, ob der Baustein ansprechbar ist.

pi@raspberrypi ~ $ sudo i2cdetect 1
WARNING! This program can confuse your I2C bus, cause data loss and worse!
I will probe file /dev/i2c-1.
I will probe address range 0x03-0x77.
Continue? [Y/n] Y
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- 48 -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
pi@raspberrypi ~ $

Der ADS1015 taucht hier mit der (hexadezimalen) Adresse 0x48 im Listing auf.

Start des scratchClient:

cd ~/scratchClient
sudo python src/scratchClient.py -c config/config_adc_ads1015.xml

Scratch erhält die Werte vom scratchClient  im Bereich 0..3300 (ungefähr) als adc_A2. Das ungefähr deswegen, da der Baustein die Spannung absolut mit seiner eingebauten Referenzspannung misst. Wenn jetzt die 3.3-V-Versorgung der RPi etwas vom Sollwert 3300 mV abweicht, so weicht auch der Maximalwert ab.

Der Name ‘adc_A2’ ist in der Konfigurationsdatei so eingestellt, da im Beispiel der Kanal A2 verwendet wird.

Spielekonsole Brotbox

konsole_in_action

Die Spielekonsolen konnten im Kurs nicht gebaut werden. Um trotzdem die Spiele steuern zu können wurden einfache ‘Standard-Konsolen’ bereitgestellt. Das Bild zeigt ein Beispiel: Brotdose aus dem Supermarkt und ein Potentiometer und ein Taster eingebaut.  Die Anbindung an der Adapterplatine erfolgt mit etwa 60 cm langem Flachbandkabel,

Andere Konsolen haben vier Taster oder zwei Potentiometer und einen Taster.

Eine Variante ist ein Brett mit zwei IR-Abstandsensoren. Der Abstand des Bretts zum Tisch, genauer der Mittelwert der beiden Sensoren, wird zum Steuern der x-Koordinate benutzt. Die Neigung, die Differenz der beiden Sensorwerte, wird für die y-Koordinate verwendet.

MCP3202 AD-Wandler am Raspberry Pi

Siehe auch
Atmel 328-Prozessor als AD-Wandler für Raspberry Pi
ADS1015 als AD-Wandler am Raspberry Pi

Im Schulkurs wird eine Adapterplatine verwendet. Im Prinzip sind alle Experimente aber auch ohne diese Platine möglich.

Eine der Ausnahmen ist der Anschluss eines Potentiometers, für das ein Analog-Digital-Umwandler ‘ADC’ benötigt wird.

Der im Kurs verwendete Baustein “MCP3202 CI/P” ist im steckbaren DIP-Gehäuse erhältlich. Der Baustein kann auf dem Steckbrett benutzt werden.

ikg_adc_direkt_Steckplatine

Der Baustein  wird über den SPI-Bus angespochen. Das sind die im Diagramm verwendeten blauen Signale. Die schwarzen und roten Drähte sind die Stromversorgung des Bausteins. Der gelbe Draht ist der Spannungseingang des ADC; da ist im Aufbau ein Potentiometer angeschlossen.

Für den Aufbau der Schaltung sollte der raspberry pi ausgeschaltet sein. Die Schaltung sorgfältig aufbauen und kontrollieren.

Die für den Anschluss an scratch nötige Software ist der scratchClient, die Konfiguration ist config/config_ikg_adc.xml.

cd ~/scratchClient
sudo python src/scratchClient.py -c ikg_adc

Bei der Installation des Rechners muss der SPI-Treiber aktiviert werden.

scratch performance antipattern

In a workshop in a school, the kidsare building a computer game and to control it by a hand made ‘controller’. Most teams have 2 potentiometer and buttons build in a box, and the adapter board plus python scratchClient is sending the values to scratch. In most games, the xPoti and yPoti control some sprite on the screen.

When the applications grow, most teams complain that the computer is too slow. I admit, a raspberry pi is no supercomputer-high-performant unit. But in most cases there are typical patterns of code to be avoided. These are the ‘performance antipatten’.

See here some of these pattern, and possible workarounds.

forever-move-pattern

Most teams implement movement patterns the following way.
forever-move-pattern

The problem with this script is that it consumes a lot of CPU power. When more than one sprite is moved this way, then all the sprites get slow.

First improvement is to use a small delay in the loop.

forever-move-pattern-2

Now the script makes short pauses and CPU is free to perform other action. The drawback is that the steps need to be larger and movement is not perfectly steady.

Next improvement is to use the ‘glide’-statement instead.

forever-move-pattern-3

This is – for this purpose – the perfect solution. CPU -efficient and smooth. The only problem is that this movement can’t be stopped.

always-move-pattern

We use sensor values, here adcValueX and adcValueY to control sprites on stage.
The following loop is quite a challenge for the Raspberry Pi.

repeat forever
    x = adcValueX / 2.2 - 240
    y = adcValueY   / 2.8 - 180
    move object to (x, y)

The scaling is not the problem, but small fluctuations in the sensor values cause the sprite to move, using CPU for almost not visible movements.

There is some noise limiting in the scratchClient for the adc channels, but even with stable input values this nice and innocent looking loop is a performance eater.

When changing the code to a ‘move only when changes occur’, the CPU load is much lower.

local.adcValuePrevX = -1
local.adcValuePrevY = -1
local.x
local.y
repeat forever
    if abs( adcValuePrevX - adcValueX ) > 4 OR  abs( adcValuePrevY - adcValueY ) > 4
        x = adcValueX / 2.2 - 240
        y = adcValueY   / 2.8 - 180 
        move object to (x, y)
        adcValuePrevX = adcX
        adcValuePrevY = adcY

With this script, given in pseudocode, the sprite is moved only when noticeable movements are needed. Perhaps a small wait-time would even give better results.

variable-on-stage-pattern

Variables on stage are consuming astonishing much CPU. Moving a sprite is fast, when no variables are displayed. When variables are on stage, CPU usage increases to 100%.
When variables need to be displayed for debug purpose, then provide a script which hides/displays them.
script2

Note on this pattern: with scratch 2015-01-15, the performance of watchers on stage is much better.

loop-pattern

In almost all projects the kids developed I found the pattern: loops to make decisions.

The example here is a counter value, visualized on stage by some red bubbles. The bubble implement a loop, basically ‘when counter > 3 then show, else hide. This check is performed in a loop. For this example, this needs nine loops, running all the time.

loop-pattern-stage

For the ‘red bubbles’. the kids start with looping solutions.

loop-pattern-stage

These small loops cost about 5% CPU load each, for the above example this is quite expensive.

The better approach is to go for an event driven solution. When changing the variabls, an event is send. The ‘bubble’-sprites react on these events. The loops no longer needed.

event-pattern_sendSender side.

event-pattern-receiveReceiver side.

The difference in CPU load on a Raspberry Pi B is 80% for the loops and 35% for the event driven solution.

The samples are downloadable here:
loop-pattern-0.sb (with loops)
loop-pattern-1.sb (with events)

loop_when_needed

Loops can not always be avoided. But when needed, these loops should be shut down when not needed in order to reduce CPU load. Here first the CPU consuming pattern, two loops started at Green Flag, running forever.

loop_when_needed_antipattern

These loops have been needed for the application, so the only way is to start them only when needed and stop them when this part of the application no longer is used.

The blue boxes show the changes. When a certain situation needs these loop (here when ‘3 Spiel’ is started), the scripts set a local variable ‘move’ to ‘true’. This is done in each script, as there is no guarantee in which order these scripts are started (left first, then the right one; but could also be other way round). The move variable is sprite-local, because then the same name can be used in every sprite for this purpose, making it easier to understand.

loop_when_needed

Inside the loop, there is a check whether this variable is set to false, and then the loop is terminated.
The ‘Game Over’ signal sets the ‘move’ variable to false. Then the loops are stopped.

This pattern needs a good understanding of when scripts need to be executed and when to be stopped.

 

Telefonwählscheibe für scratch

In den Tiefen meiner Bastelkiste habe ich eine alte Telefonwählscheibe gefunden.

dialplateDiese Wählscheiben waren vor der Tasten- und Mobilzeit in den Telefonen verbaut. Die Scheiben haben einen Mechanismus eingebaut, der je nach gewählter Zahl die entsprechende Anzahl oft einen Schalter öffnet (nsi-Schalter).

timing
Das Bild zeigt  eine Aufzeichnung des Timings für die Zahl ‘7’. Die Zeitdauer für einen Impuls ist ca 100ms lang. 0 bedeutet: Schalter geschlossen, 1 bedeutet: Schalter offen.

Die Aufzeichnung wurde mit dem Adapter selbst durchgeführt. Die Daten wurden in eine Datei geschrieben und dann mit libreoffice Tabellenkalkulation als Grafik dargestellt.
Ein weiterer Schalter ist geschlossen, sobald die Scheibe gedreht wird (nsa-Schalter). Dieser Schalter steuerte im obigen Bild die Aufzeichnung.
Für die Wählscheibe wurde ein Adapter für die scratchClient-Software erstellt: adapter.encoder.GPIODialPlateEncoder. Der Adapter liefert einen Wert ‘counter’.

Der Anschluss an GPIO erfordert pullup-Widerstände und ist ansonsten aber unproblematisch.

Eine Beispiel- Konfiguration ist bei der scratchClient-Software in config/config_telefonwaehlscheibe.xml enthalten.

scratch zu scratch Kommunikation

Im Schularbeitskreis sind mehrere Raspberry Pi im Einsatz, Jeder mit Scratch ausgestattet. Da liegt es nahe eine Kommunikation zwischen den Scratch-Instanzen aufzubauen.

context diagramIn dem Beispiel läuft auf einer Maschine eine Eisenbahnsimulation, die von einem zweiten Rechner aus gesteuert wird. Hier können die Weichen verstellt werden.

Auf jedem Rechner läuft der scratchClient; auf einem Rechner zusätzlich ein scratchCommunicationServer, der die Kommunikation herstellt.

Die Software für dieses Beispiel ist im Download der ScratchClient-Software enthalten.

A video, showing the software in action: