Raspberry Pi üzerinde Node.js ile dc motor kontrolü

Daha önceki makalelerimizde Raspberry pi üzerine nasıl node.js, socket.io kurulacağından bahsetmiştir. Bu makalede önceki bilgileri de kullanarak raspberry'e bağladığımız bir aracı başka bir bilgisayardan nasıl kontrol edebileceğimizden bahsedeceğiz.

Raspberry ile dc motor kontrol etmek için L293d entegresine ihtiyacımız var. 4-5TL'ye her elektronikçide bulabileceğiniz bir entegre.

Bağlantıların nasıl yapılacağını araştırırken bu siteye rastladım: http://computers.tutsplus.com/tutorials/controlling-dc-motors-using-python-with-a-raspberry-pi--cms-20051 Bağlantıların nasıl yapılacağını çok güzel anlatmış. Fakat ben devre kartını oluştururken kolaylık olması açısından bazı pinlerin yerini değiştirdim.

İsis çizimi şu şekilde

Ares çizimi ise şöyle

L293d entegresinin özelliği iki dc motoru iki yönde sürebilmesi. Bunu yaparken her bir motor için raspberry'den 3 gpio pin'i kullanacağız. Benim örneğimde 1. Motoru sürmek için kullanılmak üzere 16,18,22. Ve 2. Motoru sürmek için 19,21,23. bacaklar.

Üstteki ve alttaki tabloları örnekleyecek olursak 1.motoru ileri hareket ettirmek için motoru Enable edip A bacağına sinyal yollamamız gerekiyor, yani bu örnekte 16 ve 22. Pinlere (GPIO'da 23 ve 25) 1 değerini göndereceğiz. Aşağıda ise bu değerlerin doğruluk tablosu verilmiş.

 

İşin donanımsal kısmıyla ilgili söyleyeceklerim bunlar. Gelelim yazılım tarafına… Raspberry üzerinde node.js ve socket.io kurulu olması gerekiyor. Bir önceki websocket'le ilgili makalede de olduğu gibi yazılım kısmının iki ayağı bulunmakta. Bir server ve bir client. Şu sitede http://evothings.com/controlling-a-toy-car-with-evothings-and-raspberry-pi/ yapacağımız işin tam karşılığı bulunmakta. Client tarafında güzel bir arayüz mevcut ve tüm proje dosyalarını githubda paylaşmış arkadaş. Kendisine teşekkür ediyoruz. Ben de kendi hazırladığım dosyaları yazının sonunda paylaşıyor olacağım. Önce server tarafından başlayalım.

sudo nano gpioMotorControl.js

komutuyla yeni bir dosya açıyoruz. Kodlar aşağıdaki gibi olacak.    

// socket.io'yu açıp 8085. portu dinliyoruz
var io = require('socket.io').listen(8085)

// Load required modules.
var sys = require('sys'),
exec = require('child_process').exec

// Path to Raspbian's gpio driver, used for sending signals to the remote.
var path = '/sys/class/gpio/',
// pin numaralarını buraya giriyoruz
        pins = [23,24,25,10,9,11 ];

// kullanılacak pinleri açıp ayarlıyoruz initPins fonksiyonunun kodları aşağıdadır.
initPins()

//hazırlayacağımız komutları çalıştırmak için bunu kullanacağız
function calistir(command)
{
    exec(command, function (error, stdout, stderr)
    {
        if (error !== null)
            console.log('exec error: ' + error)
    })
}



// burda socket.io bir clientin bağlanmasını bekler
io.sockets.on('connection', function (socket)
{
    console.log('baglanti kuruldu');
    // clienttan gelen bilgiyi dinliyoruz

    socket.on('direction', function (data)
    {
        console.log('gelen yön: ' + data);

        // hazırlayacağımız komut değişkeni
        command = ''
        //ileri giderken 1. ve ikinci motorların A ve E pinlerine 1 gönderiyoruz
        if ( data === 'UP' )
        {
            command = 'echo 1 > ' + path + 'gpio23/value';
            calistir(command);
            command = 'echo 1 > ' + path + 'gpio11/value';
            calistir(command);

            command = 'echo 1 > ' + path + 'gpio25/value';
            calistir(command);
            command = 'echo 1 > ' + path + 'gpio10/value';
            calistir(command);
        }
        else if ( data === 'DOWN' )
        {
            command = 'echo 1 > ' + path + 'gpio23/value';
            calistir(command);
            command = 'echo 1 > ' + path + 'gpio11/value';
            calistir(command);

            command = 'echo 1 > ' + path + 'gpio24/value';
            calistir(command);
            command = 'echo 1 > ' + path + 'gpio9/value';
            calistir(command);
        }
        else if ( data === 'RIGHT' )
        {
            command = 'echo 1 > ' + path + 'gpio11/value';
            calistir(command);

            command = 'echo 1 > ' + path + 'gpio10/value';
            calistir(command);
        }
        else if ( data === 'LEFT' )
        {
            command = 'echo 1 > ' + path + 'gpio23/value';
            calistir(command);

            command = 'echo 1 > ' + path + 'gpio25/value';
            calistir(command);
        }
        //ileri tuşu bırakıldığında motoru durdurmak için aynı pinlere bu sefer 0 değerini yazıyoruz
        else if ( data === 'STOPUP' )
        {
            command = 'echo 0 > ' + path + 'gpio23/value';
            calistir(command);
            command = 'echo 0 > ' + path + 'gpio11/value';
            calistir(command);

            command = 'echo 0 > ' + path + 'gpio25/value';
            calistir(command);
            command = 'echo 0 > ' + path + 'gpio10/value';
            calistir(command);
        }

        else if ( data === 'STOPDOWN' )
        {
            command = 'echo 0 > ' + path + 'gpio23/value';
            calistir(command);
            command = 'echo 0 > ' + path + 'gpio11/value';
            calistir(command);

            command = 'echo 0 > ' + path + 'gpio24/value';
            calistir(command);
            command = 'echo 0 > ' + path + 'gpio9/value';
            calistir(command);
        }
        else if ( data === 'STOPRIGHT' )
        {
            command = 'echo 0 > ' + path + 'gpio11/value';
            calistir(command);

            command = 'echo 0 > ' + path + 'gpio10/value';
            calistir(command);
        }
        else if ( data === 'STOPLEFT' )
        {
            command = 'echo 0 > ' + path + 'gpio23/value';
            calistir(command);

            command = 'echo 0 > ' + path + 'gpio25/value';
            calistir(command);
        }

    })

})



function initPins()
{
    // Enable control of the Raspberry Pi's gpio pins.
    // Read more at http://elinux.org/RPi_Low-level_peripherals#Bash_shell_script.2C_using_sysfs.2C_part_of_the_raspbian_operating_system
    for (var pin in pins)
    {
        console.log('Creating port ' + pins[pin] + '...')

        // The command first checks whether the port already exists.
        var command = 'if (! [ -f ' + path + 'gpio' + pins[pin] + '/direction ]); then ' +
                'echo ' + pins[pin] + ' > ' + path + 'export; fi';

        // Create the ports using Raspbian's command line.
        exec(command, function(error, stdout, stderr)
        {
            if (error === null)
                console.log('Successfully created port.')
            else
                console.log('Error when creating port: ' + error + ' (' + stderr + ').')
        })
    }

    // Configure the Raspberry Pi's gpio pins as output ports which enables signals
    // to be sent to the car's remote control.
    // Read more at http://elinux.org/RPi_Low-level_peripherals#Bash_shell_script.2C_using_sysfs.2C_part_of_the_raspbian_operating_system
    for (var pin in pins)
    {
        console.log('Configuring port ' + pins[pin] + '...')

        // The command configures the pin as an output port.
        var command = 'echo out > ' + path + 'gpio' + pins[pin] + '/direction'

        // Configure the ports using Raspbian's command line.
        exec(command, function(error, stdout, stderr)
        {
            if (error === null)
                console.log('Successfully configured pin.')
            else
                console.log('Error when configuring port: ' + error + ' (' + stderr + ').')
        })
        }
    }

Client tarafında kullanacağımız dosyaları ekleyeceğim fakat bizim için önemli olan client içindeki index.htm dosyası. Kodları ise şu şekilde

<!DOCTYPE html>
<html>
<head>
	<title>Raspberry Car</title>
	<meta charset="UTF-8" />
	<meta name="viewport"
		content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0" />
	<link rel="stylesheet" href="index.css" />
	<script src="libs/jquery-2.1.1.js"></script>
	<script src="libs/jquery.mobile.custom.js"></script>
	<script src="libs/thumbstick.js"></script>
	<script src="http://192.168.2.6:8085/socket.io/socket.io.js"></script>
	<script>
	$(document).ready(function() {

		try {
		    // Connect to the server running on the Raspberry Pi.
            //ip adreslerinin ve portların doğru olduğuna emin olun
			var socket = io.connect('http://192.168.2.6:8085')
			socket.on('connect', function() {
			    alert('connected');
			})
		} catch (error) {
			alert('Failed to connect to the Raspberry Pi!')
		}

		// Create a thumbstick in the canvas.
		var thumbStick = new ThumbStick('stage')
		thumbStick.init()
		$(window).resize(thumbStick.onResizeCanvas.bind(thumbStick))

		// Listen for directional events from the thumbstick and send them to
		// the Raspberry Pi, which sends corresponding signals to the car's
		// remote control.
		thumbStick.addEventListener(
			['UP', 'DOWN', 'LEFT', 'RIGHT',
			'STOPUP', 'STOPDOWN', 'STOPLEFT', 'STOPRIGHT'],
			function(directionEvent) {
			    try {
                    //raspberry'e bilgi gönderdiğimiz yer burası
				    socket.emit('direction', directionEvent)
				    //alert(directionEvent)
				} catch (error) { }
			})

	})
	</script>
</head>
<body>
	<h1>Raspberry Car</h1>
	<div id="canvas_container">
		<canvas id="stage" width="1024" height="690"></canvas>
	</div>
</body>
</html>

Ve test videosu

Ve dosyalar        

Yorum ekle