#firmataAnalogMonitor.rb #Requires: ncurses & serialport library for ruby # simpleAnalogFirmata.pde loaded onto the Arduino. #by Justin Catalana justincatalana@gmail.com inhocsignovinces.net #October 25 2008 #For educational purposes. require "ncurses" require "serialport.so" firmataCodes = { "e0" => "Analog/PWM From Pin 0:", "e1" => "Analog/PWM From Pin 1:", "e2" => "Analog/PWM From Pin 2:", "e3" => "Analog/PWM From Pin 3:", "e4" => "Analog/PWM From Pin 4:", "e5" => "Analog/PWM From Pin 5:", } port_str = "/dev/tty.usbserial-A7006vri" #Serial ID (Change this). baud_rate = 115200 #Standard bitrate fir Firmata v2. data_bits = 8 stop_bits = 1 parity = SerialPort::NONE arduino = SerialPort.new(port_str, baud_rate, data_bits, stop_bits, parity) begin Ncurses.initscr Ncurses.cbreak Ncurses.noecho Ncurses.nonl Ncurses.stdscr.intrflush(false) Ncurses.stdscr.keypad(true) Ncurses.curs_set 0 #This should hide the cursor, but isn't working. Ncurses.stdscr.clear() Ncurses.stdscr.border(*([0]*8)) Ncurses.stdscr.move(1,1) Ncurses.stdscr.addstr("Arduino Firmata Analog Port Monitor. ") Ncurses.stdscr.move(3,18) Ncurses.stdscr.addstr("analogRead") Ncurses.stdscr.move(3,30) Ncurses.stdscr.addstr("mV") Ncurses.stdscr.move(4,2) Ncurses.stdscr.addstr("Analog Port 0:") Ncurses.stdscr.move(5,2) Ncurses.stdscr.addstr("Analog Port 1:") Ncurses.stdscr.move(6,2) Ncurses.stdscr.addstr("Analog Port 2:") Ncurses.stdscr.move(7,2) Ncurses.stdscr.addstr("Analog Port 3:") Ncurses.stdscr.move(8,2) Ncurses.stdscr.addstr("Analog Port 4:") Ncurses.stdscr.move(9,2) Ncurses.stdscr.addstr("Analog Port 5:") Ncurses.getch() while true do oneByte = arduino.getc::to_s(16) if (firmataCodes[oneByte] != nil) #Checks to make sure the byte is a command. #Analog read commands are send as two 7-bit bytes. #Below they are correctly added together. #If you know how to make this look better, tell me. commandPin = oneByte.split(//) alogLSB = arduino.getc::to_s(2) alogMSB = arduino.getc::to_s(2) total = 0 bitArray = alogMSB.split(//) + alogLSB.split(//) for i in 1..bitArray.size total += (bitArray[i-1].to_i)*(2**(bitArray.size-i)) end mV = (total*4.5).to_s << " " s1 = total.to_s << " " if 0 <= total && total < 1024 #clears bad bits. case commandPin[1] when "0" Ncurses.stdscr.mvaddstr(4, 18, s1) Ncurses.stdscr.mvaddstr(4, 30, mV) when "1" Ncurses.stdscr.mvaddstr(5, 18, s1) Ncurses.stdscr.mvaddstr(5, 30, mV) when "2" Ncurses.stdscr.mvaddstr(6, 18, s1) Ncurses.stdscr.mvaddstr(6, 30, mV) when "3" Ncurses.stdscr.mvaddstr(7, 18, s1) Ncurses.stdscr.mvaddstr(7, 30, mV) when "4" Ncurses.stdscr.mvaddstr(8, 18, s1) Ncurses.stdscr.mvaddstr(8, 30, mV) when "5" Ncurses.stdscr.mvaddstr(9, 18, s1) Ncurses.stdscr.mvaddstr(9, 30, mV) end end Ncurses.refresh() end end Ncurses.getch() ensure arduino.close Ncurses.endwin end