Table of Contents

MonkeySee - MonkeyDo

Introducere

O masinuta/robotel care primeste un fisier de comenzi (.MKD) pe un card SD/MMC si interpreteaza miscarile specificate.

Proiectul e format din doua parti, dupa cum sugereaza si numele:

Un fisier .MKD contine comenzi secventiale, cate una pe linie, compuse din doua parti: (directia) durata. Detalii la sectiunea Limbaj.

Descriere generală

Schema de ansamblu a proiectului, cu plasarea ambelor module de nivel inalt:

In continuare va fi tratat doar modulul MonkeyDo, ce prezinta scopul acestui proiect scolar. Pentru modulul de inregistrare vizuala de fisiere .mkd accesibil prin web, se poate folosi direct demo-ul online.

O diagrama block de nivel inalt a modulului MonkeyDo:

Hardware Design

Partea hardware a proiectului e formata din:

Placa principala e alimentata la 4 baterii (acumulatori) AA.

Driverul de motoare

Foloseste o punte H dubla L293NE ale carei iesiri sunt protejate prin diode 1N4004. Diodele legate ca in schema de mai jos ofera protectie impotriva eventualei inductii produse in motoare.

Motoarele sunt alimentate de la o baterie de 9V.

Pentru conectare la ATmega se foloseste portul C al acestuia.

Soclul de card SD/MMC

Cumpararea unui soclu de card a ridicat probleme. In final am cumparat un mic cititor de carduri (card SD la USB), care a costat pana in 10lei, si am dezlipit soclul de acolo (proces minutios).

O alta problema a fost ca prima oara l-am montat cam dupa ureche, si, nefiind tocmai standard, l-am nimerit prost.

LCD 7 segmente

Afisajul e folosit pentru a indica starea curenta in care se afla programul, actiunea efectuata si eventuale erori. A fost foarte util in faza de debugging, neavand cablu serial.

Conexiunea la ATmega se face pe portul A al acestuia, pe care e dezactivat ADC-ul.

Afisajul e de tipul catod comun, anozii ledurilor fiind legate la pinii portului A ca in imagine (in partea dreapta cifrele reprezinta numarul portului, ex. 6 = PA6)

Software Design

Descrierea codului aplicaţiei (firmware):

main.c

Implementeaza main-loop-ul programului in care monteaza sistemul de fisiere de pe card, citeste si parseaza fiecare instructiune secvential, si actiunea specificata in instructiune este executata.

parser.c/h

Contine functii ce efectueaza parsarea instructiunilor:

parse_movement()

Parseaza prima parte a unei instructiuni, ex. (>^), si returneaza un byte in care sunt setate flaguri corespunzator cu comenzile din instructiune

parse_duration()

Se ocupa de a doua parte a instructiunii, de durata comenzii. Intoarce un int reprezentand valoarea duratei citite.

seven_segment.c/h

Contine functii de abstractizare a lucrului cu afisajul. Functia sseg_display(char c) e responsabila de afisarea caracterului c. In caz de insucces, se va afisa un caracter special (vezi Rezultate Obţinute).

Doua alte functii folosite pentru a afisa animatii specifice: sseg_wait_anim() si sseg_start_anim().

sseg_error(char c) va afisa eroarea cu codul c.

Inainte de folosirea acestor functii, trebuie apelata functia de initializare init_sseg().

car_control.c/h

Contine, pe langa o functie de initializare a lucrului cu motoarele init_car(), functii de comanda pentru driverul motoarelor:

Rezultate Obţinute

Putin dezamagitor ca, desi robotelul merge ok, nu reuseste sa vireze din cauza sasiului vechi (sau a alimentarii necorespunzatoare, desi ma indoiesc).

Cateva exemple de output afisat de afisajul cu 7 segmente de un caracter:

Pentru ca acest tip de afisaj e conceput pentru cifre exclusiv, nu orice caracter poate fi afisat. Simbolurile acestea sunt limita imaginatiei mele si exista posibilitatea ca pentru altcineva ele sa nu sugereze nimic.

Mesaje de eroare si alte mesaje

Filmulete demonstrative:

Demo afisaj | Demo masinuta

Concluzii

Se pare ca pe placuta nu primesc SEGFAULT pentru alocari defectuoase. Am invatat astfel sa apreciez si sa iubesc segfaulturile :)

Deasemenea, a fost prima data cand am vazut ca memory-leak-urile chiar dauneaza. Si sunt si un bug destul de obscur: mergea brici timp de 6-7 iteratii, dupa care, brusc, nu mai mergea.

Download

Intregul proiect (ambele module) sunt disponibile pe GitHub:

Si pentru situatia in care pica GitHub-ul: monkeydo-src.zip (si materiale auxiliare monkeydo-aux.zip(43MB) - contine si un fisier de input demo)

Un mic ChangeLog al proiectului poate fi urmarit pe Github - MonkeyDo.

Bibliografie/Resurse

Resurse Software
Resurse Hardware