Motor Control via Ardumoto Using Arduino and Clodiuno
Here is another post that is partly for documentation and partly for safekeeping. Following snippet which I ripped from another robot we have been working on, demonstrates how to control the Ardumoto motor driver shield using Clodiuno.
Control for motor attached to OUT 1-2 is connected to digital line 12 (direction) and digital line 10 (PWM). Control for motor attached to OUT 3-4 is connected to digital line 13 (direction) and digital line 11 (PWM).
(ns ardumoto.core (:use [clojure.contrib.swing-utils :only [add-action-listener]]) (:use clodiuno.core) (:use clodiuno.firmata) (:import (javax.swing JFrame JPanel JButton) (net.miginfocom.swing MigLayout))) (def pwm-pin-motor-a 10) (def pwm-pin-motor-b 11) (def dir-pin-motor-a 12) (def dir-pin-motor-b 13) (def speed 200) (defn board [] (arduino :firmata "/dev/tty.usbserial-A6008nhh")) (defn init-pins [board] (pin-mode board pwm-pin-motor-a PWM) (pin-mode board pwm-pin-motor-b PWM) (pin-mode board dir-pin-motor-a OUTPUT) (pin-mode board dir-pin-motor-b OUTPUT)) (defn motor [board m p] (let [motor-pin (if (= m :a) pwm-pin-motor-a pwm-pin-motor-b) dir-pin (if (= m :a) dir-pin-motor-a dir-pin-motor-b) pwm (if (< p 0) (* -1 p) p) dir (if (< p 0) LOW HIGH)] (analog-write board motor-pin pwm) (digital-write board dir-pin dir))) (defn listener [press-f release-f] (proxy [java.awt.event.MouseListener] [] (mousePressed [e] (press-f)) (mouseReleased [e] (release-f)) (mouseClicked [e]) (mouseEntered [e]) (mouseExited [e]))) (defn panel [] (let [arduino (ref nil) panel (JPanel. (MigLayout.)) left (JButton. "Left") right (JButton. "Right") forward (JButton. "Forward") backward (JButton. "Backward") connect (JButton. "Connect") init (JButton. "Init") set-speed #(do (motor @arduino :a %1) (motor @arduino :b %2)) stop #(do (motor @arduino :a 0) (motor @arduino :b 0))] (add-action-listener connect (fn[_] (dosync (ref-set arduino (board))))) (add-action-listener init (fn[_] (init-pins @arduino))) (.addMouseListener left (listener #(set-speed (* -1 speed) speed) stop)) (.addMouseListener right (listener #(set-speed speed (* -1 speed)) stop)) (.addMouseListener forward (listener #(set-speed speed speed) stop)) (.addMouseListener backward (listener #(set-speed (* -1 speed) (* -1 speed)) stop)) (doto panel (.add forward "cell 3 1") (.add backward "cell 3 3") (.add left "cell 2 2") (.add right "cell 4 2") (.add connect "cell 2 4") (.add init "cell 4 4")))) (defn frame [] (let [panel (panel)] (doto (JFrame.) (.add panel) (.pack) (.setVisible true))))