Raspberry Pi + Makey Makey = Cats that Tweet
The Lofty Aim
Allow our cats to tweet the mundane events of their lives.
The Plan
The Plan
Set up sensors connected to a computer, then program the computer to send tweets when the sensors trigger.
I hatched a cunning plan.
The diagram to the left is missing one thing only: a cooperative cat...
...but how hard can that be?
The Hardware - #1 a "Makey Makey" - $50
A "Makey Makey" is a USB device that the computer thinks is a keyboard, but it actually tells the computer a key has been pressed when you put two wires together.
Makey Makey
Raspberry Pi
The Hardware - #2 a "Raspberry Pi" kit - $160
A "Raspberry Pi" is a super-cheap $35 computer... I bought mine from "Aus Pi" for $160 in a kit with a USB hub, wireless card, power etc.
I already had a webcam!
The Software - #1 Rasberrian
I'm familiar with Windows, but the Raspberry Pi computer comes with "Rasberrian" pre-installed. The good news for me is I see desktop similar to Windows, with a start button, desktop icons and a taskbar.
Python
The Software - #2 Python
I need to program the computer to tweet when the cats have their water.
Python is a computer programming language. I have never used it before. The Raspberry Pi comes with "Python" already installed and good to go.
The Learning Process
I had a stack of stuff to learn to make this work. It was much easier than I expected.
I had to figure out:
- how to get around my Raspberry Pi, and specifically how to operate it remotely from another computer for convenience
- how to get my Python program to run automatically when the Raspberry Pi boots up
- how to program in Python: #1 to wait for input from the Makey Makey, #2 to take a photo with the webcam and #3 how to send the photo as an attachment via email to Flickr.com
- I already knew how to tell Flickr to accept such emails and post them to Twitter, with the email text as the tweet, and the attachment as the photo.
I learned by:
- for each element I needed to learn, googling and exploring heaps of web pages and tutorial videos
- copying and pasting Python code I did not understand and tinkering with it
- writing little Python programs that do just one of the tasks, one at a time, before stitching them together
The learning process was glorious... on one day I spent well over 12 hours with no proper break. Flow, flow, flow!
The End Result
If we build, it will the cats come?
Yes!
The Actual Python Code
import time
import os
import pygame
from pygame.locals import *
import smtplib
from email.MIMEMultipart import MIMEMultipart
from email.MIMEBase import MIMEBase
from email.MIMEText import MIMEText
from email.Utils import COMMASPACE, formatdate
from email import Encoders
import sys
import subprocess
my_subject = "Miao Miao! Hello, this is Timo or Baps telling the world
that we're enjoying some water! Look and see:"
USERNAME = "#######"
PASSWORD = "#######"
def takepicture():
grab_cam = subprocess.Popen(
"sudo fswebcam -r 320*240 -S 15 -d /dev/video0
/home/pi/HappyTimo.jpg", shell=True)
grab_cam.wait()
def sendMail(send_to, subject, text, files=[]):
assert type(files)==list
assert type(send_to)==list
msg = MIMEMultipart()
msg['From'] = USERNAME
msg['To'] = COMMASPACE.join(send_to)
msg['Date'] = formatdate(localtime=True)
msg['Subject'] = subject
msg.attach( MIMEText(text) )
for file in files:
part = MIMEBase('application', "octet-stream")
part.set_payload( open("/home/pi/HappyTimo.jpg","rb").read() )
Encoders.encode_base64(part)
part.add_header('Content-Disposition', 'attachment; filename="%s"'
% os.path.basename(file))
msg.attach(part)
server = smtplib.SMTP('smtp.gmail.com',587)
server.ehlo()
server.starttls()
server.ehlo()
server.login(USERNAME,PASSWORD)
server.sendmail(USERNAME, send_to, msg.as_string())
server.quit()
pygame.init()
screen = pygame.display.set_mode((640,480))
pygame.display.set_caption('Pygame Caption')
pygame.mouse.set_visible(0)
done= False
while not done:
pygame.event.clear()
happened = pygame.event.wait()
if happened.type == QUIT:
done=True
elif happened.type == NOEVENT:
print "confusing"
elif (happened.type == KEYDOWN):
print happened
print happened.key
if happened.key == K_SPACE:
print happened
print happened.key
takepicture()
time.sleep(10)
sendMail( ["########@photos.flickr.com"],
my_subject,
"tags: cat",
["HappyTimo.jpg"] )
time.sleep(5)
pygame.event.clear()
else:
done=True
sys.exit()
Next Step
- maybe get a Ninja Block to expand sensor capabilities
- expand the repertoire of trigger events and the wording of tweets
- could the cats blog? could they Facebook? could they run for office?