Personal Blog

Raspberry Pi + Makey Makey = Cats that Tweet

The Lofty Aim

Allow our cats to tweet the mundane events of their lives. 

IMG_8673 (Medium).JPG
The Plan

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

Makey Makey

Raspberry Pi

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. 

rpi-desktop.jpg
Python

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?