Automatic Cat Toy ­čÉ▒

Nume: Popescu Ioana-Denisa

Grupa: 336CA

Introducere

Considerate animale de companie crepusculare, majoritatea pisicilor domestice ├«╚Öi manifest─â activitatea noaptea, av├ónd un nivel ridicat de energie ╚Öi dorin╚Ť─â de joac─â. Din p─âcate, factori precum programul ├«nc─ârcat ╚Öi dorin╚Ťa natural─â de odihn─â ├«i ├«mpiedic─â pe proprietari s─â interac╚Ťioneze cu felinele, care t├ónjesc, conform studiilor, dup─â aten╚Ťie uman─â.

Proiectul Automatic Cat Toy ├«╚Öi propune s─â rezolve aceast─â problem─â, venind ca o punte de mijloc care s─â ├«mpace ambele p─âr╚Ťi: felina se joac─â fericit─â, iar proprietarul are o odihn─â lini╚Ötit─â.

Descriere general─â

Schema Bloc

Proiectul const─â ├«n implementarea unei juc─ârii automate pentru pisici, componenta principal─â pe care se bazeaz─â fiind Arduino UNO ATmega328P. Vor exista, ├«n principal, 2 moduri de func╚Ťionare, care vor putea fi selectate prin intermediul unui buton:

  • Modul activ - juc─âria se mi╚Öc─â continuu la diferite intensit─â╚Ťi ╚Öi unghiuri, care pot fi reglate prin intermediul unui poten╚Ťiometru. Mi╚Öcarea se face printr-un ServoMotor, stabilizat si legat de un ansamblu special construit. ├Än acest mod, se va aprinde un led de o anumit─â culoare (ro╚Öu/verde) ├«n func╚Ťie de unghi ╚Öi se va afi╚Öa pe ecran o mic─â anima╚Ťie specific─â.
  • Modul senzor - se aprinde un led galben, iar ini╚Ťial, juc─âria st─â nemi╚Öcat─â. Mi╚Öcarea se va declan╚Öa prin intermediul unui senzor, ├«ncadrat ├«ntr-un suport, care va m─âsura distan╚Ťa minim─â fa╚Ť─â de pisic─â, la un nivel inferior, la care aceasta are acces. ├Än momentul ├«n care pisica este ├«n zona senzorului, juc─âria face o scurt─â mi╚Öcare, apoi revine ├«n starea ini╚Ťial─â p├ón─â la o nou─â ├«nregistrare pe senzor. Pe LCD se va afi╚Öa un mesaj care con╚Ťine informa╚Ťii despre distan╚Ťa la care se afl─â pisica.

Hardware Design

List─â de piese

  • Arduino UNO - ATmega328P
  • Ecran LCD
  • Modul interfa╚Ť─â I2C LCD
  • ServoMotor SG90
  • Senzor Ultrasonic HC-SR04
  • Poten╚Ťiometru
  • 3 Led-uri
  • 3 rezisten╚Ťe de 150 ╬ę
  • 1 rezisten╚Ť─â de 1K ╬ę
  • 1 buton
  • Leg─âtur─â cu un calculator pentru interfa╚Ťa serial─â
  • Fire, 2 Breadboard-uri
  • Condensator 2.2 nF

Schem─â Hardware

Conectare componente

Modul interfa╚Ť─â I2C LCD

Folosit at├ót pentru a reduce num─ârul pinilor necesari conect─ârii Arduino, c├ót ╚Öi pentru manevrarea cu u╚Öurin╚Ť─â a contrastului de pe LCD cu ajutorul poten╚Ťiometrului incorporat.

  • GND Ôćĺ GND
  • VCC Ôćĺ 5V
  • SDA (Serial Data Pin) Ôćĺ A4
  • SCL (Clock Pin) Ôćĺ A5

ServoMotor SG90

Necesar mi╚Öc─ârii juc─âriei, at├ót la o pozi╚Ťie predefinit─â, c├ót ╚Öi ├«nt├ómpl─âtoare, folosind PWM.

  • GND Ôćĺ GND
  • VCC Ôćĺ 5V
  • PWM Ôćĺ PD5

Senzor Ultrasonic HC-SR04

M─âsoar─â distan╚Ťa p├ón─â la obiectul detectat, ├«nmul╚Ťind timpul dintre transmiterea semnalului sender si primirea celui reciever (reflectat) cu viteza luminii.

  • GND Ôćĺ GND
  • VCC Ôćĺ 5V
  • Trig (trimite pulsul) Ôćĺ PD9
  • Echo (identific─â reflexia de la obiect) Ôćĺ PD10

Poten╚Ťiometru

Utilizat pentru a mi╚Öca servomotorul cu un anumit unghi, prin control variabil asupra semnalelor. Aici s-a folosit un convertor analog-digital, iar pinii de GND ╚Öi Wiper au fost pu╚Öi ulterior ├«n paralel cu un condensator de 2.2 nF pentru stabilitate (valorile se aflau ini╚Ťial ├«ntr-o fluctua╚Ťie continu─â ╚Öi era dificil de aproximat un rezultat).

├Än func╚Ťie de valoarea sa, se aprind ledurile succesiv: cel ro╚Öu pentru valori mai mari de 500, altfel, cel verde.

  • T1 Ôćĺ GND
  • Wiper Ôćĺ A0
  • T2 Ôćĺ VCC

Buton

La ap─âsare, se schimb─â modurile de func╚Ťionare ╚Öi se aprinde ledul galben. Determinarea st─ârii butonului se face cu o ├«ntrerupere de tip Pin Change Interrupt.

  • Terminal 1b Ôćĺ D7
  • Terminal 2b Ôćĺ VCC

Circuit Fizic (variant─â ini╚Ťial─â)

Rezultatele simul─ârii

├Än aceast─â etap─â am conectat componentele Hardware ╚Öi am scris si o parte din cod, baz├óndu-m─â strict pe func╚Ťii Arduino. Rezultatul a fost unul a╚Öteptat, func╚Ťionalit─â╚Ťile de baz─â mergeau, ├«ns─â logica programului nu era ├«nc─â implementat─â ╚Öi optimizat─â, iar designul era ├«nc─â la nivel teoretic. Ulterior, circuitul a fost pu╚Ťin modificat deoarece am constatat c─â pinii pentru servomotor nu erau potrivi╚Ťi, am ad─âugat un condensator ╚Öi am schimbat pu╚Ťin pozi╚Ťionarea pentru a elimina firele redundante.

Software Design

În ceea ce privește partea de software, am folosit Arduino IDE cu următoarele biblioteci:

  • Servo.h pentru controlul servomotor-ului
  • LiquidCrystal_I2C.h pentru LCD
  • Wire.h pentru scrierea pe LCD

Ca idee general─â, componentele interac╚Ťioneaz─â prin variabile partajate, declarate volatile sau static. Pe l├óng─â func╚Ťiile clasice Arduino utilizate, cele mai interesante concepte software de care m-am folosit au fost:

  1. Pin Change Interrupt (Timer 2)
  2. PWM (Compare Match Interrupt, Timer 0)
  3. ADC

Workflow

Logica programului este ilustrat─â ├«n schema de mai jos. Modul de func╚Ťionare default este modul 1, cu mi╚Öcarea ├«n func╚Ťie de poten╚Ťiometru.

Întrerupere Pin Change pe Timer 2

Pentru ├«ntreruperea de tip Pin Change de la buton, am folosit Timer-ul 2. Aici afl─âm practic modul de func╚Ťionare. Ini╚Ťial, am f─âcut urm─âtoarele configur─âri:

PCICR |= B00000100;   // set Timer 2
PCMSK2 |= B10000000;  // PCINT23 = PD7

A╚Öa arat─â rutina de ├«ntrerupere. Am dezactivat Timer-ul 0 ├«n timpul ap─âs─ârii pentru a evita interferen╚Ťe.

ISR(PCINT2_vect) {

 int buttonStatus = digitalRead(button);  // Read the current button status
 
 if (buttonStatus && !buttonPressed) {   // Button was just pressed
 
  digitalWrite(led, !digitalRead(led));  // Toggle the yellow LED status
  buttonPressed = true;                  
  TIMSK0 &= ~_BV(OCIE0A);                // Disable Timer0 interrupt during button press
  
 } else if (!buttonStatus && buttonPressed) {  // Button was just released
   buttonPressed = false;                     
   TIMSK0 |= _BV(OCIE0A);                      // Enable Timer0 interrupt during button press
 }
}

Întrerupere Compare Match pentru Timer 0 (PWM)

Ideea aici a fost s─â mi╚Öc servomotorul ├«n pozi╚Ťii c├ót mai random, la un interval regulat, atunci c├ónd senzorul detecteaz─â mi╚Öcarea unui obiect apropiat. ├Än fuc╚Ťia setup(), am f─âcut urm─âtoarele ini╚Ťializ─âri:

TCCR0A = _BV(COM0B1) | _BV(WGM00) | _BV(WGM01);  // Non-Inverting Fast PWM Mode, Fast PWM, 0-255, resets to 0
TCCR0B = _BV(WGM02) | _BV(CS02) | _BV(CS00);     // Waveform Generation Mode, Prescaler 1024
OCR0A = 31;                                      // Set TOP value
OCR0B = 15;                                      // Set initial value
TIMSK0 |= _BV(OCIE0A);                           // Enable Timer 0 Compare Match
sei();                                           // Enable interrupts

Calcule internal counter frequency

f_int = 16,000,000 / (1024 * (255 + 1)) = 16,000,000 / 262144 = 61.0352 Hz

Rutina de ├«ntrerupere, modul 2 de func╚Ťionare. ├Än func╚Ťie de valoarea counter-ului Timer, calculez o nou─â pozi╚Ťie de deplasare ╚Öi un nou unghi pentru mi╚Öcarea servomotorului.

ISR(TIMER0_COMPA_vect) {
 Time++;                     // Global volatile variable
 if (Time == 20) {
  
   // Move servo
   if (forward) {
     pos += 5;               // Increment position
     if (pos >= 180)
       forward = false;      // Reached the maximum position, change direction
   } else {
     pos -= 5;               // Decrement position
     if (pos <= 0)
       forward = true;       // Reached the starting position, change direction
   }
   move = true;
   Time = 0;                 // Reset timer
 }
}

ADC

Dup─â stabilizarea poten╚Ťiometrului cu ajutorul condensatorului, am configurat citirea valorii ├«n felul urm─âtor:

ADMUX |= B01000000;      // 5 V
ADCSRA |= B01000111;     // Prescaler 128 and Enable
ADCSRA |= (1 << ADSC);   // ADC Start Conversion
while (!(ADCSRA & (1 << ADIF))); // Wait
uint16_t result = ADC;

Apoi transform valoarea citit─â ├«ntr-un unghi pentru servomotor, folosind func╚Ťia map. ├Än cod se observ─â utilizarea unei formule pentru aproximarea rezultatului, ├«ntruc├ót poten╚Ťiometrul, chiar ╚Öi cu acel condensator ├«n paralel, avea momente de instabilitate.

static uint16_t smoothedResult = result; 
const float smoothingFactor = 0.5;        // Smoothing factor - for more control over servo
smoothedResult = smoothingFactor * smoothedResult + (1 - smoothingFactor) * result;
int servoPosition = map(smoothedResult, 0, 1023, 0, 180); // map value to get angle
myServo.write(servoPosition); // move servo

Restul func╚Ťiilor, elementele de sincronizare ╚Öi dependen╚Ťele dintre variabile sunt explicate mai detaliat ├«n README-ul ╚Öi codul din arhiv─â:

  • drawAnimations Ôćĺ Afi╚Öeaz─â pe LCD titlul ╚Öi anima╚Ťia ini╚Ťial─â cu 5 pisici care dispar succesiv p├ón─â la ├«nceperea jocului.
  • updateLCD Ôćĺ Se scrie un mesaj pe LCD, ├«n modul de func╚Ťionare 2, la un interval de timp, care s─â nu fie prea rapid (probleme cu PWM).
  • moveServo() Ôćĺ Func╚Ťie care misc─â efectiv servomotorul.
  • nonBlockingServoControl() Ôćĺ Aceasta este o func╚Ťie care s─â mi╚Öte servomotorul ├«n modul de func╚Ťionare 2, la o pozi╚Ťie random calculat─â ├«n rutina de ├«ntrerupere.

Rezultate Obţinute

Rezultatul este o juc─ârie func╚Ťional─â, cu un design atractiv, care ├«i ofer─â mobilitate, foarte interesant─â pentru pisici, a╚Öa cum se poate observa ╚Öi din demo-ul de mai sus!

Consider c─â rezultatul final dep─â╚Öe╚Öte simularea ini╚Ťial─â, cu func╚Ťii Arduino, care bifa criteriile de func╚Ťionalitate, ├«ns─â la capitolul feature-uri ╚Öi fiabilitate l─âsa de dorit.

Concluzii

A fost un proiect foarte interesant, primul de p├ón─â acum care implic─â componente fizice ╚Öi lucru manual pentru design. Am lucrat cu mare drag la el, mai ales av├ónd ├«n vedere scopul s─âu ╚Öi m-am bucurat foarte tare s─â ├«mi v─âd ideea pus─â ├«n practic─â dup─â at├ótea s─âpt─âm├óni. Bine├«n╚Ťeles, au existat ╚Öi o serie de situa╚Ťii ╚Öi evenimente neprev─âzute, din care am putut trage o serie de concluzii:

  • La un astfel de proiect, trebuie s─â ai foarte clar ├«n minte ce vrei s─â faci ╚Öi mai ales de ce ai nevoie exact. S-a ├«nt├ómplat s─â am nevoie ulterior primei comenzi de rezisten╚Ťe, alt tip de buton, condensator, etc.
  • Exist─â posibilitatea s─â nu prime╚Öti componentele pe care le-ai comandat, evident o mare problem─â dac─â ai nevoie de ceva specific.
  • Lucrul cu ├«ntreruperi ╚Öi AVR este dificil, ├«╚Ťi consum─â timp, dar te face s─â ├«n╚Ťelegi ╚Öi s─â descoperi ce se afl─â ├«n spatele func╚Ťiilor Arduino ╚Öi po╚Ťi pune ├«n aplicare ce vezi ├«n DataSheet.
  • S─â implementezi un proiect cu componente fizice este mult mai interesant ca pe TinkerCad.
  • Multe biblioteci ╚Öi func╚Ťii folosesc deja ├«n spate Timer 1, deci trebuie aten╚Ťie mare.
  • Biblioteca LiquidCrystal nu este chiar at├ót de u╚Öor de manipulat ╚Öi poate cauza probleme ├«n combina╚Ťie cu rutina de ├«ntreruperi.
  • Servomotorul consum─â foarte mult curent/resurse ╚Öi genereaz─â electrical noise care poate interfera cu modulul I2C de pe LED.
  • Ar fi fost de preferat, ├«n cazul proiectului meu, s─â alimentez LCD-ul la alt─â surs─â, sau tot circuitul la o surs─â peste 5V.
  • Poten╚Ťiometrul are fluctua╚Ťii foarte mari ╚Öi este foarte delicat, ajut─â s─â pui ├«n paralel cu pinii s─âi un condensator.

Download

Arhiva cu codul sursă și README cu detalii despre implementare:

automatic_cat_toy_v2.zip

Jurnal

  • 20 Aprilie - Alegere tem─â proiect
  • 26 Aprilie - Confirmare tem─â, discu╚Ťie la laborator
  • 5 Mai - Documenta╚Ťie Ini╚Ťial─â
  • 6 Mai - Comand─â piese
  • 9-13 Mai - Livr─âri
  • 14 Mai - Magazin fizic - ServoMotor, Led-uri, Rezisten╚Ťe
  • 21 Mai - Hardware ╚Öi func╚Ťionalit─â╚Ťi de baz─â
  • 22 Mai - Implementare logic─â ╚Öi AVR
  • 24 Mai - Implementare buton ├«ntrerupere Pin Change
  • 26 Mai - ├Äntrerupere PWM, schimb─âri sumare hardware
  • 27-28 Mai - Design ╚Öi Finalizare cod
  • 29 Mai - Finalizare Design, Introducere condensator, testare

Bibliografie/Resurse

pm/prj2023/apredescu/automatic_cat_toy.txt ┬Ě Last modified: 2023/05/30 00:42 by ioana.popescu1905
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