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:

  • MonkeySee: partea care inregistreaza in mod vizual fisierul de comenzi
  • MonkeyDo: partea embedded care interpreteaza comenzile

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:

  • Sasiu masinuta cu roti, mecanism de viraj si motoare
  • Driver de motoare
  • Display LCD cu 7 segmente, un caracter
  • Soclu de card SD/MMC (inclus pe placa ATmega-ului)
  • Alimentare placa ATmega-ului si a driverului
  • Alimentare motoare

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):

  • mediu de dezvoltare: editare cod in SublimeText2, build folosind Makefile
  • librării şi surse 3rd-party: Petit FAT FS pentru citirea de pe card SD/MMC

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:

  • go_fwd() - goes forward
  • go_bkd() - goes backward
  • brake()
  • turn_left()
  • turn_right()
  • no_movement() - opreste orice miscare

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

  • E P - reprezinta o eroare la parsare. Aici intra si atingerea sfarsitului fisierului, deci orice secventa de comenzi se va termina cu acest mesaj
  • E F - nu se reuseste deschiderea pentru citire a fisierului .mkd curent
  • E d - nu se poate deschide directorul radacina de pe card
  • Animatia circulara - se asteapta introducerea unui card, sau, in cazul in care un card e introdus deja, sistemul de fisiere al cardului nu poate fi montat
  • S cu animatie intermitenta - simbolizeaza inceperea unei noi secvente de comenzi (fisier) si serveste drept delay.

Filmulete demonstrative:

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
  • L293NE
  • 7-segment display
  • soclu card SD/MMC
pm/prj2012/avoinescu/5.txt · Last modified: 2021/04/14 17:07 (external edit)
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0