Blog posts for this project:
This week's progress on the IoT Alarm Clock! Mainly soldering, but also some testing.
Pi-Lite
During boot, I noticed some messages and characters were being displayed on the Pi-Lite. To get rid of this, I followed the steps below.
Edit the inittab file and comment out the following line (completely at the end of the file):
sudo nano /etc/inittab T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
Edit the cmdline.txt and remove the following part:
sudo nano /boot/cmdline.txt console=ttyAMA0,115200 kgdboc=ttyAMA0,115200
The full explanation can be found on the Ciseco website:0: Setting up the Raspberry Pi to work with Ciseco hardware
Arduino Micro
As mentioned in the first part of this project, I'll be using an Arduino Micro to add a bunch of I/O to the Raspberry Pi.
Using a small prototyping PCB and some male and female headers, I made a board to which:
- the Arduino Micro can easily be plugged in or removed/replaced
- buttons, LEDs, etc ... can easily be added and plugged in
As illustrated below, one row of male headers is connected to the Arduino's I/O on each side, and a second row of headers is connected to ground.
This allows me to plug in components which on one end will be connected to the Arduino I/O and on the other end to ground.
I configured the Arduino to wait for interrupts and send a character over the Serial interface towards the Raspberry Pi via the USB connection.
The Raspberry Pi waits for data to come in, and once it does, triggers the correct action.
Arduino code:
void setup() { pinMode(0, INPUT_PULLUP); pinMode(1, INPUT_PULLUP); pinMode(2, INPUT_PULLUP); attachInterrupt(1, sendA, FALLING); attachInterrupt(2, sendB, FALLING); attachInterrupt(3, sendC, FALLING); Serial.begin(9600); } void loop() { } void sendA() { Serial.println('A'); } void sendB() { Serial.println('B'); } void sendC() { Serial.println('C'); }
Raspberry Pi code:
import serial import os ser = serial.Serial("/dev/ttyACM0",9600) while(1): x = ser.read() if(x == 'A'): os.system("echo 'button 1' | sudo minicom -b 9600 -o -D /dev/ttyAMA0") elif(x == 'B'): os.system("echo 'button 2' | sudo minicom -b 9600 -o -D /dev/ttyAMA0") elif(x == 'C'): os.system("echo 'button 3' | sudo minicom -b 9600 -o -D /dev/ttyAMA0") ser.close()
The result of this test:
Buttons
The breadboard pushbuttons worked fine, but I wanted something good looking, so I got some shiny illuminated pushbuttons.
I soldered wires for the pushbutton and for the integrated LED. Both are connected to the Arduino Micro, which can be used to react on button presses, but can also dynamically turn the button's LED on or off.
For example, by default all LEDs could be off until a button is pressed, in which case the LEDs will light up for 30 seconds before turning off again.
Single power supply
Because I'm using the onboard amplifier of the Wolfson audio card, the card requires external power. Along with the Pi itself and the Pi-Lite, that makes a bunch of different components requiring a 5V power source.
I only want to use a single power supply to power my project, so I grabbed some cables, started cutting, stripping and soldering them into a master cable able to power all components.
Also, to make a more reliable connection to the Pi-Lite, I soldered some male header pins to which I can connect power and the serial pins of the Wolfson audio card.
As you can see in the last picture, all components are now properly connected to the Pi.
Train API
With all the soldering and hardware setup pretty much done, it was time to move to the software part of this project.
To fetch the train data and be able to use it in the alarm clock, an API to query is most useful.
Luckily, there is a third party API available for belgian public transportation, called iRail. API documentation can be found here: API/APIv1 – Project iRail
I've made some tests with calls that will be interesting for my application:
- List stations: useful for defining from where to where you need to take the train
- List trains from station A to station B on a certain day with a certain departure or arrival time
- http://api.irail.be/connections/?to=Brussels%20South&from=Lokeren&date=140514&time=0900&timeSel=arrive&typeOfTransport=train
- From: Lokeren
- To: Brussels South
- On: May 14, 2014
- Arrival: 09:00
- Transport: Train
The second call returned 6 possible train connections between "Lokeren" and "Brussels South" for an arrival time around 09:00.
This data will need to be parsed carefully and the connection offering the most time to sleep in, while ensuring a timely arrival, should be selected.
In the exceptional case that all trains would be delayed, additional time to sleep in can be provided, while still picking the train connection with the best arrival time.
Enclosure
I started working on the enclosure in parallel. Not much done yet, but here's a sneak peek:
Top Comments