In a previous post, I described a method I've been using to collect Fitbit data into a Google spreadsheet for use in things like R.
Since then, I've found two things that make that process even easier.
One is an R package, googlesheets, that easily loads data from a Google spreadsheet into an R dataframe. More on that in another post.
The other is the use of IFTTT to load connect to my Fitbit account and send the data to a Google spreadsheet. IFTTT has connections to both Fitbit and Google Drive. It makes it easy to set up a connection for both activity data and sleep data. I currently have two IFTTT recipes, one for activity data and one for sleep data.
Friday, December 25, 2015
Thursday, January 16, 2014
Raspberry Pi and a PIR Sensor
Today, I successfully used the Human Sensor PIR module with the RPi. I ordered this: http://www.amazon.com/gp/product/B007XQRKD4/
I followed this blog post. The only change was different GPIO port numbers:
http://www.millamilla.com/?p=18
When moving in front of the sensor, the LED turns on.
Worked great!
There are two manual adjustments on the module:
I followed this blog post. The only change was different GPIO port numbers:
http://www.millamilla.com/?p=18
When moving in front of the sensor, the LED turns on.
Worked great!
There are two manual adjustments on the module:
- Sensitive Setting: turn to right, distance increases (about 7m); turn to left, distance reduces (about 3m)
- Time Setting: turn to right, time increases (about 300 seconds); turn to left, time reduces (about 5 seconds).
Monday, January 13, 2014
Raspberry Pi and WiFi
I purchased a Edimax EW-7811Un wireless USB adapter (http://www.amazon.com/Edimax-EW-7811Un-Wireless-Adapter-Wizard/dp/B003MTTJOY) for my raspberry pi,
Setup:
With the ethernet still plugged in, I remoted in and used the WPA_GUI tool (shortcut already on the desktop). I was able to connect but when I tried it with the ethernet disconnected, it didn't work.
Long story short (after lots of troubleshooting), I needed to save the configuration in the WPA_GUI tool. It's been working since.
Another possible cause of the intermittent problem is with the usb hub (d-link dub-h7). When plugged into the pi, the pi would not start and when restarting right away without the usb hub, the wifi adapter (usb) wouldn't work. I suspect that power from the usb hub was causing the fuse to open for a short period of time, rendering the usb port inoperable until it closes again.
Setup:
With the ethernet still plugged in, I remoted in and used the WPA_GUI tool (shortcut already on the desktop). I was able to connect but when I tried it with the ethernet disconnected, it didn't work.
Long story short (after lots of troubleshooting), I needed to save the configuration in the WPA_GUI tool. It's been working since.
Another possible cause of the intermittent problem is with the usb hub (d-link dub-h7). When plugged into the pi, the pi would not start and when restarting right away without the usb hub, the wifi adapter (usb) wouldn't work. I suspect that power from the usb hub was causing the fuse to open for a short period of time, rendering the usb port inoperable until it closes again.
Wednesday, January 8, 2014
Raspberry Pi and Temperature Sensor
Today I successfully connected the DS18B20 temperature sensor to the RPi. I ordered the waterproof version that comes with ~ 2 ft leads.
I used the following Adafruit lesson to the letter and it worked great:
http://learn.adafruit.com/adafruits-raspberry-pi-lesson-11-ds18b20-temperature-sensing/overview
I used the following Adafruit lesson to the letter and it worked great:
http://learn.adafruit.com/adafruits-raspberry-pi-lesson-11-ds18b20-temperature-sensing/overview
Monday, December 30, 2013
RPi - Controlling a Servo Motor
Today I set up the Raspberry Pi to control a servo motor.
For the hardware setup, I referred to chapter 10 from the Raspberry Pi Cookbook. Aside from the Pi, I only used the Pi Cobbler, a 1k resistor, and a 4AA battery pack. I didn't use any other special components. In the future, I'll consider getting a specialized breakout board for controlling servos.
For the software, I started with the code from this blog post: http://www.doctormonk.com/2012/07/raspberry-pi-gpio-driving-servo.html
Note that in Simon Monk's post, he uses a transistor in his circuit that I didn't use based on the circuit in the book.
My first attempt didn't work well. The servo would turn very slowly, arriving at the 180 degree position, and stay there. I could feel the motor working but there was little to no movement.
After further research, I made some modifications to the starting code including changing the order of the True and False statements and playing with the timing. Things started to work. I was reading that servos needed between a .001 and .002 second pulse to move between 0 and 180 degrees respectively. I was finding those to be too long. For my servo, the range was between .00055 and .002. I don't know if that is a servo thing or if that helps to compensate for a delay from the RPi itself.
Finally, I added some code to accept an angle 0-180 as input and convert that angle into the appropriate timing of the pulses. I also had that input affect the number of loops because for shorter angle changes, a greater number of loop iterations would result in the motor jumping around slightly after reaching the desired angle. Now I can probably convert this to a function and use with other programs.
I had been reading about others experiencing a jittery movement when only using GPIO to control the servo but once I figured out the appropriate timing and loops, I found that it moved very smoothly. I don't know if there are other factors that I'm not experiencing that could affect the performance.
The Code:
import RPi.GPIO as GPIO
import time
import math
pin = 18
refresh_period = 0.02
prev_angle = 90 #initiate previous angle
GPIO.setmode(GPIO.BCM)
GPIO.setup(pin, GPIO.OUT)
GPIO.output(pin, False)
while True:
angle = int(input('Angle: '))
# convert degrees (0-180) to the servo pulse (.00055 to .002ms)
pulse = (angle * .00000805555) + .00055
# determine the number of loops based on degrees needed to travel, a shorter distance (degrees) to travel = fewer loops
loops = math.ceil(math.fabs(prev_angle - angle) * .135) + 2
prev_angle = angle
# move the servo arm
for i in range(1, loops):
time.sleep(refresh_period)
GPIO.output(pin, True)
time.sleep(pulse)
GPIO.output(pin, False)
For the hardware setup, I referred to chapter 10 from the Raspberry Pi Cookbook. Aside from the Pi, I only used the Pi Cobbler, a 1k resistor, and a 4AA battery pack. I didn't use any other special components. In the future, I'll consider getting a specialized breakout board for controlling servos.
For the software, I started with the code from this blog post: http://www.doctormonk.com/2012/07/raspberry-pi-gpio-driving-servo.html
Note that in Simon Monk's post, he uses a transistor in his circuit that I didn't use based on the circuit in the book.
My first attempt didn't work well. The servo would turn very slowly, arriving at the 180 degree position, and stay there. I could feel the motor working but there was little to no movement.
After further research, I made some modifications to the starting code including changing the order of the True and False statements and playing with the timing. Things started to work. I was reading that servos needed between a .001 and .002 second pulse to move between 0 and 180 degrees respectively. I was finding those to be too long. For my servo, the range was between .00055 and .002. I don't know if that is a servo thing or if that helps to compensate for a delay from the RPi itself.
Finally, I added some code to accept an angle 0-180 as input and convert that angle into the appropriate timing of the pulses. I also had that input affect the number of loops because for shorter angle changes, a greater number of loop iterations would result in the motor jumping around slightly after reaching the desired angle. Now I can probably convert this to a function and use with other programs.
I had been reading about others experiencing a jittery movement when only using GPIO to control the servo but once I figured out the appropriate timing and loops, I found that it moved very smoothly. I don't know if there are other factors that I'm not experiencing that could affect the performance.
The Code:
import RPi.GPIO as GPIO
import time
import math
pin = 18
refresh_period = 0.02
prev_angle = 90 #initiate previous angle
GPIO.setmode(GPIO.BCM)
GPIO.setup(pin, GPIO.OUT)
GPIO.output(pin, False)
while True:
angle = int(input('Angle: '))
# convert degrees (0-180) to the servo pulse (.00055 to .002ms)
pulse = (angle * .00000805555) + .00055
# determine the number of loops based on degrees needed to travel, a shorter distance (degrees) to travel = fewer loops
loops = math.ceil(math.fabs(prev_angle - angle) * .135) + 2
prev_angle = angle
# move the servo arm
for i in range(1, loops):
time.sleep(refresh_period)
GPIO.output(pin, True)
time.sleep(pulse)
GPIO.output(pin, False)
The circuit:
The servo I used:
The servo specs:
Years ago, I created a very simple robotic arm that waves and was able to revive it once again with the RPi!
Labels:
circuit,
cobbler,
GPIO,
python,
raspberry pi,
servo motor
Saturday, December 28, 2013
FitBit Data to Google Spreasheet
I received a FitBit for Christmas and while the website provides access to a lot of data a graphs, I wanted a way to access the data in a format to process with R (statistics).
I found the following blog post which points to the use of a Google script that accesses the data via the developer API and populates a Google spreadsheet.
http://citizen-statistician.org/2012/09/30/getting-data-from-fitbit/
It was pretty straight forward since I've worked a bit with Google scripts before.
It provides daily summary data across a dozen or so categories. What would be nice is more granular data.
I found the following blog post which points to the use of a Google script that accesses the data via the developer API and populates a Google spreadsheet.
http://citizen-statistician.org/2012/09/30/getting-data-from-fitbit/
It was pretty straight forward since I've worked a bit with Google scripts before.
It provides daily summary data across a dozen or so categories. What would be nice is more granular data.
Freezing Temp Alert
I created an alert on my phone to tell me when the temperature outside drops below freezing. Since I don't have my own network accessible thermometer, I am using the wunderground api to query the closest weather station, a couple of miles away. It should be close enough.
I used this blog post as a guide for accessing the wunderground api: http://www.pocketables.com/2012/07/tasker-task-that-speaks-the-weather-forecast-download.html
I set up a wunderground developer account here: http://www.wunderground.com/weather/api/
In Tasker:
The profile runs every hour.
The task is as follows:
A1: HTTP Get [ Server:Port:api.wunderground.com Path:/api/[mykey]/conditions/q/[my state abbrev]/[the town or neigborhood with the station I wanted to query].xml Attributes: Cookies: Timeout:10 Mime Type:text/plain Output File: ]
A2: Variable Set [ Name:%wunderresults To:%HTTPD Do Maths:Off Append:Off ]
A3: Variable Search Replace [ Variable:%wunderresults Search:\<temp\_f\>\d\d.\d\<\/temp\_f\> Ignore Case:Off Multi-Line:Off One Match Only:Off Store Matches In:%matchedtemp Replace Matches:Off Replace With:a ]
A4: Variable Search Replace [ Variable:%matchedtemp1 Search:\d\d.\d Ignore Case:Off Multi-Line:Off One Match Only:Off Store Matches In:%matchedtemptwo Replace Matches:Off Replace With: ]
A5: Variable Set [ Name:%oakbrookTemp To:%matchedtemptwo1 Do Maths:Off Append:Off ]
A6: Flash [ Text:%myTemp Long:Off ]
A7: If [ %myTemp < 33 ]
A8: Notify [ Title:Temperature Warning Text:%myTemp Icon:hd_alerts_and_states_warning Number:0 Permanent:Off Priority:3 ]
I had to do some parsing gymnastics to get the temperature out of the xml returned from wunderground (actions 3 and 4).
I also have the temp display on a MimialistText widget so I can see the temp anytime, not just when it's freezing.
I used this blog post as a guide for accessing the wunderground api: http://www.pocketables.com/2012/07/tasker-task-that-speaks-the-weather-forecast-download.html
I set up a wunderground developer account here: http://www.wunderground.com/weather/api/
In Tasker:
The profile runs every hour.
The task is as follows:
A1: HTTP Get [ Server:Port:api.wunderground.com Path:/api/[mykey]/conditions/q/[my state abbrev]/[the town or neigborhood with the station I wanted to query].xml Attributes: Cookies: Timeout:10 Mime Type:text/plain Output File: ]
A2: Variable Set [ Name:%wunderresults To:%HTTPD Do Maths:Off Append:Off ]
A3: Variable Search Replace [ Variable:%wunderresults Search:\<temp\_f\>\d\d.\d\<\/temp\_f\> Ignore Case:Off Multi-Line:Off One Match Only:Off Store Matches In:%matchedtemp Replace Matches:Off Replace With:a ]
A4: Variable Search Replace [ Variable:%matchedtemp1 Search:\d\d.\d Ignore Case:Off Multi-Line:Off One Match Only:Off Store Matches In:%matchedtemptwo Replace Matches:Off Replace With: ]
A5: Variable Set [ Name:%oakbrookTemp To:%matchedtemptwo1 Do Maths:Off Append:Off ]
A6: Flash [ Text:%myTemp Long:Off ]
A7: If [ %myTemp < 33 ]
A8: Notify [ Title:Temperature Warning Text:%myTemp Icon:hd_alerts_and_states_warning Number:0 Permanent:Off Priority:3 ]
I had to do some parsing gymnastics to get the temperature out of the xml returned from wunderground (actions 3 and 4).
I also have the temp display on a MimialistText widget so I can see the temp anytime, not just when it's freezing.
Subscribe to:
Posts (Atom)