For my Dragon detector project I was interested in activating some kind of attached "defence" when a dragon was detected. For this I intend to use the GPIO pins, the 96Boards GPIO library only has basic functionality at the moment, digital read and write so I need to find something else. Specifically I am looking for interupt based inputs so that my IR sensor can trigger the camera to take a photo. I'm also looking to drive a servo or two.
After reading some of the blogs from 96Boards, I thought that the Intel MRAA library would work well as it supported interrupt based inputs and PWM outputs.
Shell control of GPIO
Before getting involved in libraries, I though it best to test using simple shell commands.
I ran through the example in the low speed I/O application note and found a couple of things. Firstly, and not surprisingly you need to be root to
configure the GPIO. Switching to super user made this easier. Secondly there was a mention of adding 902 to the GPIO number, I did not find this to be the case.
To enable a pin you "export" it and then configure for output. Sending 1 turns the pin on.
sudo su echo 36 > /sys/class/gpio/export echo out > /sys/class/gpio/gpio36/direction echo 1 > /sys/class/gpio/gpio36/value
and then to turn it back off again, send a 0.
echo 0 > /sys/class/gpio/gpio36/value
Once my red LED (note that some colours of LED have a forward voltage > 1.8v so don't light up) was working correctly I thought I'd check the inputs. That's just a case of repeating the export command and reading the value. I used a jumper wire to set the input high as I did not have any switches to hand.
echo 12 > export echo in > /sys/class/gpio/gpio12/direction cat /sys/class/gpio/gpio12/value
Further investigation into libraries
When I looked into MRAA in more detail I saw that the PWM functionality was just a wrapper for existing device level functionality. A simple "ls /sys/class/pwm*" showed that there was no such function on my board.
I cross checked this by looking at the mraa_pincapabilities_t setup for the board.
https://github.com/intel-iot-devkit/mraa/blob/master/include/arm/96boards.h
And
http://iotdk.intel.com/docs/1.1/mraa/structmraa__pincapabilities__t.html
So in conclusion it does not look like PWM is supported by this library/board. Looking at Libsoc the other library mentioned in 96boards blog that too uses the pwm class so that does not help either. The Libsoc library has a wrapper for I2C which I think I'll be using to connect up an I/O board which does support PWM, so I'll go for that library.
Installing Libsoc
There are some notes on the 96Boards blog but those did not seem to be up to date. So I used the instructions from the libsoc github and that compiled successfully.
For my next post I'll switch into Python and hopefully get OpenCV detecting things from the webcam.
Reference
Bringing Standardization to Linux GPIO for 96Boards - 96Boards
How do you install 96BoardGPIO, libsoc and libmraa on a new image? - 96Boards
https://www.kernel.org/doc/Documentation/gpio/sysfs.txt
Videos
Using GPIOs on low speed connector on DragonBoard 410
DragonBoard 410C controlled RC Car
I also found this extra reference article from Qualcomm https://developer.qualcomm.com/blog/dragonboard-410c-maker-month-contest-tools-you-need