Servo Rotation

The servo can be turned clockwise, counter clockwise, and to the 90 degree position, but it lacks a way to query the current rotation. The rotation needs to be calculated manually and this script is a first attempt.

#!/usr/bin/env python

import RPi.GPIO as GPIO
import datetime
import time

servo_pin = 22
servo_pin2 = 18

# 60 degrees / 0.1seconds
servo_speed = 0.1

GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)

GPIO.setup(servo_pin, GPIO.OUT)
GPIO.setup(servo_pin2, GPIO.OUT)

last_time = datetime.datetime.now()
current_time = datetime.datetime.now()
sumTime = datetime.timedelta(0, 0)

accuracy = 0.01
targetRotation = 0
currentRotation = 90

pulse1 = GPIO.PWM(servo_pin, 50)
pulse2 = GPIO.PWM(servo_pin2, 50)

logTime = datetime.datetime.now()

def log(msg):
 global deltaTime
 global logTime
 if (logTime < datetime.datetime.now()):
  logTime = datetime.datetime.now() + datetime.timedelta(0, 0.5)
  print msg
 return

def reset(pulse):
 pulse.start(7.5);
 pulse.ChangeDutyCycle(7.5)
 return

def update(pulse, targetRotation):
 global deltaTime
 global sumTime
 global servo_speed
 global accuracy
 global currentRotation
 log ("TargetRotation: " + str(targetRotation) + " CurrentRotation: "+str(currentRotation))
 if (targetRotation == 90):
  pulse.ChangeDutyCycle(7.5)
  if ((currentRotation - targetRotation) < -accuracy):
   currentRotation += servo_speed
  elif ((currentRotation - targetRotation) > accuracy):
   currentRotation -= servo_speed
  else:
   pulse.ChangeDutyCycle(0)
 elif ((currentRotation - targetRotation) < -accuracy):
  pulse.ChangeDutyCycle(12.5)
  currentRotation += servo_speed
 elif ((currentRotation - targetRotation) > accuracy):
  pulse.ChangeDutyCycle(2.5)
  currentRotation -= servo_speed
 else:
  pulse.ChangeDutyCycle(0)
 return

try:
 reset(pulse1)
 reset(pulse2)
 time.sleep(1)
 print "setup complete"

 while True:
 
  last_time = current_time
  current_time = datetime.datetime.now()
  deltaTime = current_time - last_time;
  sumTime += deltaTime;

  if (sumTime.total_seconds() > 3.0):
   #print (sumTime)
   sumTime -= datetime.timedelta(0, 3)
   targetRotation = (targetRotation + 45) % 180

  update(pulse1, targetRotation);
  update(pulse2, targetRotation);

  time.sleep(0);

except KeyboardInterrupt:

 print '\r\nProgam complete.'
 GPIO.cleanup();

Python Time Handling

Time and logic is needed to do anything fancy in Python.

#!/usr/bin/env python

import datetime
import time

# global time of last frame
last_time = datetime.datetime.now()

# global time of current frame
current_time = datetime.datetime.now()

# a running some of the delta time of each frame
sumTime = datetime.timedelta(0, 0)

# define an update function
def update():
 # make global accessibles from function
 global deltaTime;
 global sumTime;

 #prints the current time hours, minutes, seconds, and milliseconds
 #print (datetime.datetime.now().strftime("%H:%M:%S.%f"))

 # if condition checks for 1 second to pass
 if (sumTime.total_seconds() > 1.0):
  # print the elapsed time over the last second
  print (sumTime)
  # reset the elapsed time
  sumTime -= datetime.timedelta(0, 1)
 return

try:
 while True:

  # record the time in the last frame
  last_time = current_time

  # get the current time hours, minutes, seconds, milliseconds
  current_time = datetime.datetime.now()

  # calculate the time difference between frames
  deltaTime = current_time - last_time;

  # keep track of the elapsed time
  sumTime += deltaTime;

  # invoke the update function
  update();

  # yield for the next frame
  time.sleep(0);

# wait for a key to exit
except KeyboardInterrupt:

 print '\r\nProgam complete.'

Raspberry PI 2 – Servo Control

Using pulse modulation, the Raspberry PI can adjust a servo.
https://www.youtube.com/watch?v=ddlDgUymbxc

2015-04-22+12.06.15[1]

Here I combined the LED blinking example with the servo example.

#!/usr/bin/env python

import RPi.GPIO as GPIO
import time
led_pin = 15
led_pin2 = 16
led_pin3 = 36
led_pin4 = 37

GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)

GPIO.setup(led_pin, GPIO.OUT)
GPIO.setup(led_pin2, GPIO.OUT)
GPIO.setup(led_pin3, GPIO.OUT)
GPIO.setup(led_pin4, GPIO.OUT)

GPIO.setup(22, GPIO.OUT)

p = GPIO.PWM(22, 50)
p.start(7.5);

try:
 while True:

  GPIO.output(led_pin, GPIO.HIGH)
  GPIO.output(led_pin2, GPIO.HIGH)
  GPIO.output(led_pin3, GPIO.HIGH)
  GPIO.output(led_pin4, GPIO.HIGH)
  p.ChangeDutyCycle(7.5)
  time.sleep(1)

  GPIO.output(led_pin, GPIO.LOW)
  GPIO.output(led_pin2, GPIO.LOW)
  GPIO.output(led_pin3, GPIO.HIGH)
  GPIO.output(led_pin4, GPIO.HIGH)
  p.ChangeDutyCycle(12.5)
  time.sleep(1)

  GPIO.output(led_pin, GPIO.HIGH)
  GPIO.output(led_pin2, GPIO.HIGH)
  GPIO.output(led_pin3, GPIO.HIGH)
  GPIO.output(led_pin4, GPIO.HIGH)
  p.ChangeDutyCycle(7.5)
  time.sleep(1)

  GPIO.output(led_pin, GPIO.HIGH)
  GPIO.output(led_pin2, GPIO.HIGH)
  GPIO.output(led_pin3, GPIO.LOW)
  GPIO.output(led_pin4, GPIO.LOW)
  p.ChangeDutyCycle(2.5)
  time.sleep(1)

except KeyboardInterrupt:

 print '\r\nBack to neutral...'
 p.ChangeDutyCycle(7.5)
 time.sleep(1)

 print '\r\nProgam complete.'
 GPIO.cleanup();

Raspberry PI 2 – Alternating LEDs

The following Python alternates between two LEDs and then goes dark before repeating.

20150418_211943[1]

#!/usr/bin/env python

import RPi.GPIO as GPIO
import time
led_pin = 15
led_pin2 = 37
blinkSpeed = 5/2.0 #blink x times per second

GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)

GPIO.setup(led_pin, GPIO.OUT)
GPIO.setup(led_pin2, GPIO.OUT)

try:
 while True:

  GPIO.output(led_pin, GPIO.HIGH)
  GPIO.output(led_pin2, GPIO.LOW)
  time.sleep(blinkSpeed / 3.0)

  GPIO.output(led_pin, GPIO.LOW)
  GPIO.output(led_pin2, GPIO.HIGH)
  time.sleep(blinkSpeed / 3.0)

  GPIO.output(led_pin, GPIO.LOW)
  GPIO.output(led_pin2, GPIO.LOW)
  time.sleep(blinkSpeed / 3.0)

finally:
 print 'finally'

Raspberry PI 2 – Blinking LED

Here’s a short Python script to toggle an LED using GPIO.

20150418_173116[1]

#!/usr/bin/env python

import RPi.GPIO as GPIO
import time
pin = 15
blinkSpeed = 1/5.0 #blink x times per second
GPIO.setmode(GPIO.BOARD)
GPIO.setup(pin, GPIO.OUT)
try:
 while True:
  print('PIN {} is going HIGH'.format(pin))
  GPIO.output(pin, GPIO.HIGH)
  time.sleep(blinkSpeed / 2.0)
  print('PIN {} is going LOW'.format(pin))
  GPIO.output(pin, GPIO.LOW)
  time.sleep(blinkSpeed / 2.0)
finally:
 print 'finally'

Raspberry PI 2 – Sails.js

Installing Sails.js required building and installing Node.js from source.

I let the source build overnight and then moments later ‘sails lift’ was functional.
https://github.com/tgraupmann/TAGENIGMA-Docs/blob/master/Sails.md

Also the reference guide is super helpful.
http://sailsjs.org/#!/documentation/reference/

Here is also a useful C# client:
https://github.com/Quobject/SocketIoClientDotNet

Raspberry PI 2 – VNC

I picked up a Raspberry PI 2 and it’s working super speedy. Quad-core 900 MHz, ARM, 4-usb, HDMI/audio out.
http://www.amazon.com/CanaKit-Raspberry-Ultimate-Starter-Components/dp/B00G1PNG54/

After settting up WIFI, installing VNC made connecting the display, mouse, and keyboard no longer necessary. The boot process can be altered to start VNC server automatically.
https://www.raspberrypi.org/documentation/remote-access/vnc/

IBUYPOWER Six Core

I ordered a second desktop from IBUYPOWER. A bunch of components were defective and replaced under warranty. (HD, Case Fan, Memory Sticks, Graphics Card)

Still running well after (5 years running 24/7).

1 x Case Thermaltake Armor Revo Full Tower Gaming Case – Snow Edition
1 x iBUYPOWER Labs – Noise Reduction Advanced – iBUYPOWER Harmony SRS Sound Reduction System
1 x iBUYPOWER Labs – Internal Expansion [6-Port] NZXT Internal USB Expansion System + Bluetooth & Wireless N Modules
1 x Processor Intel® Coreâ„¢ i7 3930K Processor (6x 3.20GHz/12MB L3 Cache) – Intel Core i7 3930K
1 x iBUYPOWER PowerDrive PowerDrive Level 2 – Up to 20% Overclocking
1 x Processor Cooling Asetek 550LC Liquid CPU Cooling System (Intel) – ARC Dual Silent High Perfornamce Fan Upgrade (Push-Pull Airflow)
1 x Memory 64 GB [8 GB x8] DDR3-1600 Memory Module – Corsair or Major Brand
1 x Video Card NVIDIA GeForce GTX 680 – 2GB – SLI Mode (Dual Cards)
1 x Video Card Brand Major Brand Powered by AMD or NVIDIA
1 x Motherboard [3-Way SLI] ASUS Rampage IV Extreme
1 x Power Supply 1050 Watt – Thermaltake Toughpower Grand-1050M – Free Upgrade to 1200 Watt Toughpower Grand-1200M ($40 Savings)
1 x Primary Hard Drive 2 TB HARD DRIVE — 64M Cache, 7200rpm, 6.0Gb/s – Single Drive
1 x Optical Drive 24X Dual Format/Double Layer DVD±R/±RW + CD-R/RW Drive – Black
1 x Flash Media Reader / Writer 12-In-1 External USB Flash Media Card Reader/Writer
1 x Meter Display NZXT Sentry 2 Touch Screen Fan Controller & Temperature Display
1 x Sound Card 3D Premium Surround Sound Onboard
1 x Network Card Onboard LAN Network (Gb or 10/100)
1 x Operating System None- Pre-formatted Hard Drive Only
1 x Advanced Build Options Professional wiring for all cables inside the system tower – Achieve exceptional airflow in your chassis
1 x Advanced Build Options Professional wiring for all cables inside the system tower – Basic Pro Wiring

VirtualBox

[VirtualBox 4.0.4] adds some GUI enhancements to the virtualization software. Be sure to also install the “VirtualBox 4.0.4 Oracle VM VirtualBox Extension Pack” to support USB 2.0.

I had some initial issues running a guest of Windows XP on Windows-7. The same guest worked on Linux and MacOS. It turned out to be necessary to disable the 3d acceleration in the VM settings to avoid a crash during start-up.

To install 3d-acceleration on a Windows-XP guest, you have to boot into safe-mode.

Developing Android Apps

  1. Eclipse makes developing apps for Android super easy with the [ADT] add-on. Download [Eclipse]. You need the [Android SDK] to develop and install your Android app over USB.
  2. After you launch Eclipse, install the [ADT] add-on and restart Eclipse.
  3. Setup the path to the Android SDK in the Eclipse preferences
  4. Download and setup the [AVD] Android SDK platforms to sync with a device or virtual device. Window->Android SDK and AVD Manager
  5. Now you can create an Android project. File->New->Other-> expand Android and select Android Project.
  6. [GrepCode] is a useful Eclipse plugin.