Za upravljanje enosmernega motorja potrebujemo H-most ("H-bridge"); uporabili bomo H-most DRV883 "Single Brushed DC Motor Driver Carrier, Pololu #2990". Električna shema priklopa H-mostu je prikazana na naslednji sliki:
Izgled vezja iz zgornje strani je prikazan na naslednji sliki:
Izgled realizacije na ploščici za prototipiranje je prikazan na naslednji sliki:
Izgled vezave in postavitev je prikazana na naslednji sliki:
Pogled na H-most:
Pri programju najprej inicializiramo ploščo:
var board = new firmata.Board("/dev/ttyACM0", function(){
console.log("Aktiviramo pin 2");
board.pinMode(2, board.MODES.OUTPUT); // pin za smer na H-mostu
console.log("Aktiviramo pin 3");
board.pinMode(3, board.MODES.PWM); // Pulse Width Modulation - hitrost
});
Nato definiramo nove funkcije znotraj vtičnika ("socket"):
io.sockets.on("connection", function(socket){
socket.on("pošljiPWM", function(pwm){
board.analogWrite(3,pwm); // zapišem hitrost pwm na pin 3
console.log("PWM poslan." + pwm);
});
socket.on("levo", function(vrednost) {
board.digitalWrite(2,vrednost);
});
socket.on("desno", function(vrednost) {
board.digitalWrite(2,vrednost);
});
socket.on("stop", function(vrednost) {
board.analogWrite(3,vrednost);
});
});
Na strani klienta ustvarimo dodatne gumbe in vnosno polje za določitev vrednosti PWM ("Pulse Width Modulation") na nožici 3:
PWM: <input id="pwm" value=100 />
<button id="gumbPošljiPWM" onClick="pošljiPWM()">Pošlji PWM</button>
<button id="gumbLevo" onClick="levo()">Levo</button>
<button id="gumbDesno" onClick="desno()">Desno</button>
<button id="gumbStop" onClick="stop()">Stop</button>
Nato zapišemo funkcije, ki jih poženemo s pritiskom na zgoraj ustvarjene gumbe:
function pošljiPWM () {
vrednostPWM = document.getElementById("pwm").value;
socket.emit("pošljiPWM", vrednostPWM);
}
function levo () {
socket.emit("levo", 1);
}
function desno() {
socket.emit("desno", 0);
}
function stop() {
socket.emit("stop", 0);
}
Izgled uporabniškega vmesnika je prikazan na naslednji sliki:
Koda primera 13, .js
var http = require("http").createServer(handler); // ob zahtevi req -> handler
var firmata = require("firmata");
var fs = require("fs"); // knjižnjica za delo z datotekami (File System fs)
var io = require("socket.io").listen(http); // knjiž. za komunik. prek socket-a
console.log("Priklop Arduina");
var board = new firmata.Board("/dev/ttyACM0", function(){
console.log("Aktiviramo pin 2");
board.pinMode(2, board.MODES.OUTPUT); // pin za smer na H-mostu
console.log("Aktiviramo pin 3");
board.pinMode(3, board.MODES.PWM); // Pulse Width Modulation - hitrost
});
function handler(req, res) {
fs.readFile(__dirname + "/primer13.html",
function(err, data) {
if (err) {
res.writeHead(500, {"Content-Type": "text/plain"});
return res.end("Napaka pri nalaganju html strani!");
}
res.writeHead(200);
res.end(data);
});
}
http.listen(8080); // strežnik bo poslušal na vratih 8080
var želenaVrednost = 0; // želeno vrednost postavimo na 0
console.log("Zagon sistema"); // izpis sporočila o zagonu
board.on("ready", function(){
console.log("Plošča pripravljena");
board.analogRead(0, function(value){
želenaVrednost = value; // neprekinjeno branje pina A0
});
io.sockets.on("connection", function(socket){
socket.on("pošljiPWM", function(pwm){
board.analogWrite(3,pwm); // zapišem hitrost pwm na pin 3
console.log("PWM poslan." + pwm);
});
socket.on("levo", function(vrednost) {
board.digitalWrite(2,vrednost);
});
socket.on("desno", function(vrednost) {
board.digitalWrite(2,vrednost);
});
socket.on("stop", function(vrednost) {
board.analogWrite(3,vrednost);
});
});
}); // konec board.on("ready")
Koda primera 13., .html:
<!DOCTYPE html>
<meta charset = utf8>
<html>
<head>
<title>Primer z grafom</title>
</head>
<body>
<p></p>
PWM: <input id="pwm" value=100 />
<button id="gumbPošljiPWM" onClick="pošljiPWM()">Pošlji PWM</button>
<button id="gumbLevo" onClick="levo()">Levo</button>
<button id="gumbDesno" onClick="desno()">Desno</button>
<button id="gumbStop" onClick="stop()">Stop</button>
<script type="text/javascript" src="/socket.io/socket.io.js"></script>
<script type="text/javascript">
var socket = io.connect("192.168.1.136:8080"); // povezava na strež.
function pošljiPWM () {
vrednostPWM = document.getElementById("pwm").value;
socket.emit("pošljiPWM", vrednostPWM);
}
function levo () {
socket.emit("levo", 1);
}
function desno() {
socket.emit("desno", 0);
}
function stop() {
socket.emit("stop", 0);
}
</script>
</body>
</html>