Tuesday, January 24, 2017

BeagleBone Green Wireless IoT Developer Prototyping Kit

Have you noticed that Google Cloud is promoting an IoT Developer Prototyping Kit which features the BeagleBone Green Wireless (BBGW)? I purchased one, because I was hoping for better instructions on using the Grove System w/BBGW.

Sadly, the only documentation included w/the proto kit is a lame brochure w/a cloud solutions URL with unhelpful Arduino examples.  Yaay for Arduino, but I bought the BBGW kit.

Fine.  Challenge accepted.  Here are some notes on using BBGW and Grove System.

There are dedicated images for the BBGW and any Debian reference (within this post) is tied to bone-debian-8.6-seeed-iot-armhf-2016-11-06-4gb.img

"Grove is a modular, standardized connector prototyping system." which is a good single line summary.  The catalog is full of many sensors, switches and shiny, blinky things which plug into standard connectors.  The BBGW exposes two Grove connectors, one for I2C and the other to UART.  Two connections are OK to start, but you most likely will want the Grove Base Cape (included in proto kit) because this offers more connections and access to the ADC.

If you already know the BB, you will not be surprised to learn that the Grove connectors map directly to P8/P9 and there is no added functionality apart from the connectors.  Put another way, anything you can implement w/Grove could also be implemented the usual way via overlays and P8/P9.

There has to be software to control the interfaces and BBGW Grove promotes MRAA as a wrapper to the BBGW devices.  MRAA comes w/the Debian Seeed image and has (yet another) pin encoding scheme.  Look here for pin mapping.  The Debian Seeed image also has example python code in /usr/share/mraa/examples/python

Start easy w/a GPIO demo "blink-io8.py"

import mraa
import time


# Using BBG GPIO_51
x = mraa.Gpio(62)
x.dir(mraa.DIR_OUT)

while True:
  x.write(1)
  time.sleep(0.2)
  x.write(0)
  time.sleep(0.2)


Note the "mraa.Gpio(62)" which maps to P9_16 on BBGW and has a dedicated socket on the Grove Base Cape (look at the middle row, the GPIO are silk screened next to the Grove sockets).

Use the 3 axis accelerometer from the proto kit as an I2C example.  One of the Seeed example worked, scroll to item "03 How to use Grove - 3-Axis digital Accelerometer (16g)" for a python example.

Now for an ADC example, look at this Seeed project (scroll to "02 How to use Grove - Light Sensor & Temperature Sensor").  The wiring diagram is OK (i.e light sensor to AIN0 and temperature to AIN2) but the code is not quite working.  Here is the corrected code:
import time
import pyupm_grove as grove

light = grove.GroveLight(1)
temp = grove.GroveTemp(3)

while True:
 print light.name() + " raw value is %d" % light.raw_value() + ", which is roughly %d" % light.value() + " lux"
 celsius = temp.value()
 fahrenheit = celsius * 9.0/5.0 + 32.0
 print "%d degrees Celsius, or %d degrees Fahrenheit" % (celsius, fahrenheit)
 time.sleep(2)

What about those two Grove connectors on the BBGW?  One is for UART, the other is I2C, both support GPIO.  Here is an example Python script which uses the UART connector w/a button:
import mraa
import time

x = mraa.Gpio(68)
x.dir(mraa.DIR_IN)

while True:
 time.sleep(1)
 if x.read() > 0:
  print 'button press'
 else:
  print 'button not press'


BeagleBone Black vs BeagleBone Green

Yet another post comparing the BeagleBone Green Wireless (BBGW) to the BeagleBone Black.

Mouser has a great (hardware) comparison.

The links on the BBGW documentation pamphlet are mostly wrong, but you can find the BBGW wiki here (worth a visit).

Brief recap of differences between the BBB and BBGW hardware: HDMI is gone along w/the 5V barrel jack.  USB connector has gone from mini to micro, and if you need 5V it must be injected via the P9 header.  The RJ45 (ethernet) connector has been removed, put there are now bluetooth and WiFi radios.  There are now 4 USB ports which are tall and will interfere w/most capes.  

There are dedicated images for the BBGW and any Debian reference (within this post) is tied to bone-debian-8.6-seeed-iot-armhf-2016-11-06-4gb.img

The BBGW I2C bus maps i2c-0 and i2c-2 while BBB maps i2c-0 and i2c-1.  Expect this to be an issue when migrating applications from BBB to BBGW.

BBGW $SLOTS is at /sys/devices/platform/bone_capemgr/slots.
root@beaglebone:~# cat $SLOTS
0: PF----  -1
1: PF----  -1
2: PF----  -1
3: PF----  -1



Sunday, January 15, 2017

BeagleBone Green Wireless as a LAMP Server

This post demonstrates how to configure a BeagleBone Green Wireless (BBGW) first for WiFi tethering and then as a LAMP server.  For context, I have an IoT project (not described here) which uses the BBGW for data collection which can be examined using a web browser.

Flash your BBGW w/the latest image.  I am using "Jessie for SeeedStudio BeagleBone GreenWireless" (bone-debian-8.6-seeed-iot-armhf-2016-11-06-4gb.img).

After updating the BBGW image, log in to configure WiFi using connmanctl(1), there are example instructions in /etc/network/interfaces.

Now that you have internet connectivity, update the software using apt-get(8):
  • "apt-get update"
  • "apt-get upgrade"
Perform a gratuitous reboot for luck.

When the BBGW returns from reboot,  you should detect a fresh WiFi SSID in the form "BeagleBoneXXXXXX" where XXXXXX are integers.  This SSID was created by wifidog which is part of the BBGW Debian distribution.  

I don't need a captive portal for my purposes, so login to BBGW and invoke "apt-get remove wifidog-gateway" then reboot.

Now when the BBGW returns from reboot, you should detect a fresh WiFi SSID in the form "BeagleBone-XXXX" where XXXX are hex values representing part of the MAC address.

/etc/default/bb-wl18xx contains some tweakable parameters, such as SSID base.

/tmp/hostapd-wl18xx.conf is the actual hostapd(8) configuration file, note the wpa_passphrase "BeagleBone"


SoftAp0 is the WAP device:
root@beaglebone:/etc/default# ifconfig SoftAp0
SoftAp0   Link encap:Ethernet  HWaddr b0:d5:cc:ff:65:be  
          inet addr:192.168.8.1  Bcast:192.168.8.255  Mask:255.255.255.0
          inet6 addr: fe80::b2d5:ccff:feff:65be/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:5220 errors:0 dropped:3 overruns:0 frame:0
          TX packets:703 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 

          RX bytes:1328274 (1.2 MiB)  TX bytes:122059 (119.1 KiB)

From your laptop, connect to the BeagleBone device just as you would any other WAP.

Apache is configured for port 8080.  Verify you can connect to apache2(8) by visiting http://192.168.8.1:8080/ with your browser.

Assuming happy browser response, you now have a BBGW ready for a LAMP stack.  Note that the BBGW still has internet connectivity through wlan0 as configured earlier.

Now install mysqld(8) by invoking "apt-get install mysql-server" - when finished, verify a happy installation using mysql(1) and ensure you can at least login to mysqld(8).

Now install PHP, et al by invoking "apt-get install php5 libapache2-mod-php5 php5-mysql" - when finished, verify a happy installation by placing the usual phpinfo script into /var/www/html and visiting w/a browser.

Wednesday, December 28, 2016

Temperature Sensing w/BeagleBone Black and Adafruit PT100 RTD

Here is a simple example of collecting temperature w/BeagleBone Black (BBB) and the Adafruit PT100 RTD temperature sensor.  The PT100 sensor resistance varies directly w/temperature.  I can measure voltage drop across the PT100 sensor using an analog to digital converter (ADC) on the BBB and discover the temperature.

The BBB offers eight 12 bit ADC inputs.  ADC values range from 0 to 4096 (2^12).  Reference voltage is 1.8VDC.  Schematic below indicates Vref is on P9/pin 32, and the ADC input is P9/pin 39.  ADC ground (P9/pin 34) is tied to P9/pin 1 ground.  


My use case ranges from 0C to an upper bound of 400C.  The temperature sensor offers a resistance of 100 ohms at 0C and then .385 ohm per degree C or (in this case) a maximum  resistance of 100 + 400 * 0.385 = 254 ohms.


Given that Vref = 1.8 VDC and Rmin = 100 ohms, the current at minimum resistance is 18mA (this is a problem).  To mitigate loading, I added a LM358 op-amp as a voltage follower.  Put another way, simply reading the PT100 voltage drop might damage the BBB so I decide for additional circuitry as insurance.  


I want to use the temperature sensor as half of a voltage divider.  What value for the other half?  Old school teaches that R = sqrt(Rmin * Rmax) = sqrt(100 * 254) = 160 ohms.  Amazingly, I had a 160 ohm resistor available.

Schematic of temperature sensor demonstration

My PT100 came w/three wires ending w/a blue and two red terminals.  I only needed the blue and one of the red terminals.

To enable analog inputs requires some configuration.  This example uses Debian 7 image (bone-debian-7.11-lxde-4gb-armhf-2016-06-15-4gb.img).


root@beaglebone:~# echo $SLOTS
/sys/devices/bone_capemgr.9/slots
root@beaglebone:~# cat $SLOTS
 0: 54:PF--- 
 1: 55:PF--- 
 2: 56:PF--- 
 3: 57:PF--- 
 4: ff:P-O-L Bone-LT-eMMC-2G,00A0,Texas Instrument,BB-BONE-EMMC-2G
 5: ff:P-O-- Bone-Black-HDMI,00A0,Texas Instrument,BB-BONELT-HDMI
 6: ff:P-O-- Bone-Black-HDMIN,00A0,Texas Instrument,BB-BONELT-HDMIN
root@beaglebone:~# echo "BB-ADC" > $SLOTS
root@beaglebone:~# cat $SLOTS
 0: 54:PF--- 
 1: 55:PF--- 
 2: 56:PF--- 
 3: 57:PF--- 
 4: ff:P-O-L Bone-LT-eMMC-2G,00A0,Texas Instrument,BB-BONE-EMMC-2G
 5: ff:P-O-- Bone-Black-HDMI,00A0,Texas Instrument,BB-BONELT-HDMI
 6: ff:P-O-- Bone-Black-HDMIN,00A0,Texas Instrument,BB-BONELT-HDMIN
 7: ff:P-O-L Override Board Name,00A0,Override Manuf,BB-ADC

To read an ADC sample:
root@beaglebone:~# cd /sys/bus/iio/devices/iio:device0
root@beaglebone:/sys/bus/iio/devices/iio:device0# ls
dev              in_voltage2_raw  in_voltage5_raw  name       uevent
in_voltage0_raw  in_voltage3_raw  in_voltage6_raw  power
in_voltage1_raw  in_voltage4_raw  in_voltage7_raw  subsystem
root@beaglebone:/sys/bus/iio/devices/iio:device0# cat in_voltage0_raw
2441

For verification, I placed the PT100 in a pan of water and heated it to boiling while reading BBB ADC (voltage) values every 5 degree C (from cooking thermometer), which yields this graph (circles are samples, line is regression model).

Graph illustrates temperature change is linear (and suggests a conversion model).  

To convert ADC to temperature use: 822 - 0.329512(ADC value)

Table (below) illustrates observed vs calculated temperatures.  Real world rarely match calculated world, but these values seem close enough for my intended application.


ADCObserved CCalculated C
2479105.14
24371518.98
24242023.26
24192524.91
24033030.18
23893534.80
23784038.42
23584545.01
23475048.64
23325553.58
23186058.19
22996564.45
22847069.39
22677575.00
22518080.27
22358585.54
22189091.14
22089594.44
219510098.72


Thursday, December 22, 2016

AWS IoT and BeagleBone Green Wireless

This post demonstrates how to configure a BeagleBone Green Wireless for Amazon Web Services "Internet of Things" using the AWS CLI.

The ingredients:
  • AWS Account
  • BeagleBone Green Wireless (BBGW)
    • Working WiFi
    • Flashed w/image bone-debian-8.6-seeed-iot-armhf-2016-11-06-4gb.img
    • apt-get update
    • apt-get upgrade
Install AWS CLI on BBGW.  Perform the following steps:
  • Create a IAM user for the BeagleBone
    • download the access key ID/secret access key
  • Install AWS CLI
    • pip install awscli
  • Configure AWS CLI (using the access key ID/secret access key from above)
    • aws configure
  • Verify AWS CLI installation by performing simple command
    • aws s3 ls (s3 directories are returned)
Generate security certificates:
  • mkdir aws_certs
  • cd aws_certs
  • openssl genrsa -out privateKey.pem 2048
  • openssl req -new -key privateKey.pem -out cert.csr
  • aws iot create-certificate-from-csr --certificate-signing-request file://cert.csr --set-as-active > certOutput.txt
  • grep certificateId certOutput.txt
  • aws iot describe-certificate --certificate-id <certificateId from last step> --output text --query certificateDescription.certificatePem > cert.pem
Create a policy and attach generated certificate:
  • Create policy document (policy.doc)
    {
    "Version": "2012-10-17",
    "Statement": [{
    "Effect": "Allow",
    "Action":["iot:*"],
    "Resource": ["*"]
    }]
    }
  • aws iot create-policy --policy-name PubSubToAnyTopic --policy-document file://policy.doc
  • grep certificateArn certOutput.txt
  • aws iot attach-principal-policy --principal <certifcateArn from last step> --policy-name "PubSubToAnyTopic" 
At this point, you should be able to see the certificates/policy in the AWS console.  From the AWS IoT page, select "certificates" or "policies".
Alternatively, ask for certificates using AWS CLI:
  • aws iot list-certificates
Register your BeagleBone (thing) and attach to Principal (policy):
  • aws iot create-thing --thing-name bbgw
  • aws iot attach-thing-principal --thing-name bbgw --principal  <certifcateArn from previous step>
At this point you should be able to see the thing in the AWS console.  From the AWS IoT page, select "Registry/Things"
Alternatively, ask for things using AWS CLI:
  • aws iot list-things
Update BBGW status:
  • aws iot update-thing --thing-name bbgw --attribute-payload attributes={key1=value1}
Verify update:
  • aws iot list-things

Sunday, December 18, 2016

Infrared "break beam" detection using BeagleBone Black and Adafruit 2167

Here is a simple example of monitoring a infrared (IR) light beam w/BeagleBone Black.  There are many use cases for IR break beam sensors and for US $1.95 the Adafruit 2167 is an excellent choice.

The example provided by Adafruit is for the Arduino.  Here is a simple example using the BBB.

Schematic of "break beam" demo.
  Any GPIO will do.  Below is a runtime example from a BBB using Debian 7 (wheezy).  Note that "value" contains a 1 when the IR beam is detected and a 0 when I block the beam.

root@beaglebone:~# cd /sys/class/gpio
root@beaglebone:/sys/class/gpio# echo 115 > export
root@beaglebone:/sys/class/gpio# cd gpio115
root@beaglebone:/sys/class/gpio/gpio115# echo in > direction
root@beaglebone:/sys/class/gpio/gpio115# cat value
1
root@beaglebone:/sys/class/gpio/gpio115# cat value
0

Sunday, April 24, 2016

AWS API Gateway and Lamba (Python) Demonstration

I have a customer interested in AWS API Gateway and Lambda (Python), so I created a small demonstration application to explore this option.

The resulting application is a simple 4 function calculator web service.  There is significant overlap between this demo and the LambdaGate example provided by AWS.  This application is different because:
  • Employs Cloud Formation as much as possible
  • Python (instead of node.js) Lambda function