Skupaj 200 rubljev za nakup dobro osnovo za enostavno opravilo. Projekt je bil zaključen s tujimi kolegi Adruino Arts. Za njegovo izvajanje mora poznati osnovne principe robotike, elektronike in razumeti, malo programiranja.
V video posnetek avtor pripoveduje in kaže, da bi morali dobiti rezultat.
Poleg svetilk moramo niz Grove - Toy Kit. Da spletu lahko shop po ceni 79,9 $.
Glavna ideja - opredelitev statično ali dinamično stanje objekta z zaznavo gibanja. Če je odgovor pozitiven, potem teči eno od aktuatorjev in predvajate posneti sporočilo. V nasprotnem primeru aktivira 2. servo, in drugačen zvočni posnetek.
Določitev gredo skozi neko obliko vhoda. Tako smo dobili rezultat v binarno kodo 0 ali 1.
Snemalnik lahko predvajate zvočni posnetek le 4 preko zunanjega signala. Če želite posneti (vsak 15 sek.), Je treba preklopiti na gumb "play" v "rekordno". Po gumb Ponovno snemanje moral preklopiti. To je mogoče storiti s pomočjo kode (funkcija play ()). V servo kabla je 3 "plus", "minus" in digitalnih podatkov. Prvi 2 zagotoviti hrano za servo (max 7) in 3. povezuje digitalni izhod, ki prejme informacije o stanju stikalom in z oznako.
Najprej razčleniti svetilko. Mi ne potrebujemo električne komponente, vendar je treba delati same temelje. Potrebovali boste tudi nekaj rekvizitov in podpornih elementov.
Narediti luknjo v cevi povezati našo zasnovo.
Prototip robota je pripravljen!
Korak 1: Glow
Uporaba LED svetilko IKEA OLEBY (Food sončni pogon).
Stikalo deluje le v digitalno napravo, in zato odvisna od trenutne omrežju. Če preklopimo podsoedynym Plačajte Seeeduino, lahko nastavite digitalni izhod nizka, in potem ne bo tok. Ko dajanje visoka, se znova pojavi.
Tudi v svetilko in se priključite upor za zaščito LED.
Nastavitev svetlobe element v kovinsko podlago.
Korak 2: Načelo
Imamo žarnice priloženi servo nadzora detektorjem, trojno os accelerometer, snemalnik in igrajo 4 različne zvoke.
Osnovni princip svetilke je, kot sledi:
Izkazalo se je, da hrup (zvok)
Svetilka vključena
Deluje zapis №3
Hand Lamp omogoča gibanje (levo-desno-levo)
Servo ostaja pri 90 °
Zaključena transakcija
Če je hrup, potem:
Svetilka vključena
Servo z Lamp premakniti levo
Deluje zapis №2
Svetilka nazaj v položaju 90 °
Zaključena transakcija
Če metal roko doseže določeno (visoko) položaj, nato pa igral rekord №4.
Korak 3: Izboljšanje
Pri načrtovanju dela, lahko nekaj izboljšav vdelavo stikalo pristojbino Seeeduino, nadzorovati izvajanje kode z uporabo redni ciklus IF. Če je stikalo vklopljeno - začetek AUTO način, če ne - ročni način.
Auto-mode vključuje standardno kodo, ko lučka se odziva na zvok.
Ročni način omogoča daljinsko upravljanje s trojno os accelerometer, spreminja položaj osi X in Y.
Lahko naredite zavoj luči na 360 °, tako da mu ločen servo. Ali lahko vzpostavi povezavo prek Wi-Fi / Ethernet.
4. korak: Code
Avtor koda (MrLdnr) lahko najdete spodaj.
[Spojler]
#include
const int buttonPin = 4; // Položaj stikala
int buttonState = 0; // Spremenljivka za branje gumbov položaja
// Servo Setup
Servo myservo2;
Servo myservo; // Ustvarimo za nadzor servo
int pos = 0; // Spremenljivka za shranjevanje servo položaj
int pos2 = 0; // Spremenljivka za shranjevanje servo položaj
int VAL1;
int VAL2;
// LED SETUP
const int ledPin2 = 5; // Glavna luč
const int ledPin = 12; // Tube svetlobe
int countlamp2 = 0;
// Noise Setup
const int thresholdvalue = 300; // odziv na zvok
// Set akseleometra
int ystate;
int xstate;
#include
#define MMA766ddr 0x4c
#define MMA7660_X 0x00
#define MMA7660_Y 0x01
#define MMA7660_Z 0x02
#define MMA7660_TILT 0x03
#define MMA7660_SRST 0x04
#define MMA7660_SPCNT 0x05
#define MMA7660_INTSU 0x06
#define MMA7660_MODE 0x07
#define MMA7660_SR 0x08
#define MMA7660_PDET 0x09
#define MMA7660_PD 0x0A
Razred Pospešek
{
javnosti:
char x;
char y;
char z;
};
char indeks;
char nadzor;
char stanje;
int audiodelay = 1000;
void mma7660_init (ničen)
{
Wire.begin ();
Wire.beginTransmission (MMA766ddr);
Wire.send (MMA7660_MODE);
Wire.send (0x00);
Wire.endTransmission ();
Wire.beginTransmission (MMA766ddr);
Wire.send (MMA7660_SR);
Wire.send (0x07); // Vzorci / Drugi Active Mode in Auto-Sleep
Wire.endTransmission ();
Wire.beginTransmission (MMA766ddr);
Wire.send (MMA7660_MODE);
Wire.send (0x01); // aktiven način
Wire.endTransmission ();
}
void setup ()
{
mma7660_init (); // Pridružite I2C (naslov selektivno master naprave)
Serial.begin (9600);
// Predlog Sensor
pinMode (6 INPUT); // uporablja 2 noge za zunanji signal
// Lamp lahka in osnove svetlobe
pinMode (ledPin, OUTPUT);
pinMode (ledPin2 OUTPUT);
// Servomehanizmi
// AUDIO
DDRD | = 0x0C; // D2 in D3 write v načinu;
PORTD & = 0xF3; // D2 in D3 nastavljen na nizko;
// Senzor Hrup na Analog 0
// SWITCH
pinMode (buttonPin, INPUT);
}
void rec_2_begin ()
{
PORTD = (PORTD | 0b00000100) & 0b11110111;
}
void rec_2_stop ()
{
PORTD & = 0xF3;
}
nična play_2 ()
{
PORTD = (PORTD | 0b00000100) & 0b11110111;
zamudo (audiodelay);
PORTD & = 0xF3;
}
////////////////////////////////////////////////// ////////////////////
////////////////////////////////////////////////// /////
// Funkcija za nadzor segment_3
void rec_3_begin ()
{
PORTD = (PORTD | 0b00001000) & 0b11111011;
}
void rec_3_stop ()
{
PORTD & = 0xF3;
}
nična play_3 ()
{
PORTD = (PORTD | 0b00001000) & 0b11111011;
zamudo (audiodelay);
PORTD & = 0xF3;
}
////////////////////////////////////////////////// ///
////////////////////////////////////////////////
// Funkcija za nadzor segment_4;
void rec_4_begin ()
{
PORTD = PORTD | 0b00001100;
}
void rec_4_stop ()
{
PORTD & = 0xF3;
}
nična play_4 ()
{
PORTD = PORTD | 0b00001100;
zamudo (audiodelay);
PORTD & = 0xF3;
}
//////////////////////
void check_move ()
{
int SensorValue = digitalRead (6);
če (SensorValue == 1)
{
// DigitalWrite (ledPin, HIGH);
//Serial.println(sensorValue, DEC); // izhodni položaj signala na monitor.
// Servo1 ();
}
ostalo
{
// DigitalWrite (ledPin, LOW);
//Serial.println(sensorValue, DEC); // izhodni položaj signala na monitor.
// Servo2 ();
}
}
void servo1_right ()
{
myservo.attach (9);
za (pos = 90, pos = 90; re- = 1) // gre od 0 do 180 stopinj
{
myservo.write (pos); // Kaše servo položaj z variabilno "pos"
zamik (10); // Waits 15 ms do servo zavzema stališče
} * /
}
void servo1_left ()
{
myservo.attach (9);
za (pos = 90, pos & gt; 1; pos - = 1) // gre od 0 do 180 stopinj
{// Korakih po 1 stopinjo
myservo.write (pos); // Kaše servo položaj z variabilno "pos"
zamik (10); // Waits za 15 ms, medtem ko je servo ne sprejme stališča
} / *
play_2 ();
zamudo (1000);
za (pos = 1; pos90) {
za (pos = posact; pos & gt; 90; pos - = 1) // vrne 90 stopinj
{// Korakih po 1 stopinjo
myservo.write (pos); // Kaše servo položaj z variabilno "pos"
zamik (10); // Waits za 15 ms, medtem ko je servo ne sprejme stališča
}
}
else {
za (pos = posact; pos 60, pos - = 1) // gre od 0 do 180 stopinj
{// Korakih po 1 stopinjo
myservo2.write (pos); // Kaše servo položaj z variabilno "pos"
zamik (10); // Waits za 15 ms, medtem ko je servo ne sprejme stališča
} / *
play_2 ();
zamudo (1000);
za (pos = 1; pos90) {
za (pos = posact; pos & gt; 90; pos - = 1) // vrne položaj 90 stopinj
{// Korakih po 1 stopinjo
myservo2.write (pos); // Kaše servo položaj z variabilno "pos"
zamik (10); // Waits za 15 ms, medtem ko je servo ne sprejme stališča
}
}
else {
za (pos = posact; pos<=90 ;="" pos="" +="1)" goes="" from="" 0="" degrees="" to="" 180="">
{// Korakih po 1 stopinjo
myservo2.write (pos); // Kaše servo položaj z variabilno "pos"
zamik (10); // Waits za 15 ms, medtem ko je servo ne sprejme stališča
}
}
}
void servo1_no ()
{
myservo.attach (9);
za (pos = 90, pos = 90; re- = 1) // gre 180-0 stopinj
{
myservo.write (pos); // Kaše servo položaj z variabilno "pos"
zamik (10); // Waits za 15 ms, medtem ko je servo ne sprejme stališča
}
}
void servo2 ()
{
myservo2.attach (10);
za (pos2 = 110; pos2< 140;="" pos2="" +="1)" ??="" 0="" ??="" 180="">
{//
myservo2.write (pos2); // Kaše servo položaj z variabilno "pos"
zamik (15); // Waits za 15 ms, medtem ko je servo ne sprejme stališča
}
}
izničijo servo1R ()
{
myservo.write (90);
myservo.detach ();
}
izničijo servo2R ()
{
myservo2.write (90);
myservo2.detach ();
}
void lampblink ()
{
// Int SensorValue = digitalRead (6);
// Če (SensorValue = 1) {
digitalWrite (ledPin, HIGH);
// Delay (1);
// DigitalWrite (ledPin, LOW);
// Delay (1);
//}
// Else
// DigitalWrite (ledPin, LOW);
}
void lamptest ()
{
za (int i = 0; i<100;>
{
digitalWrite (12 HIGH);
zamudo (50);
digitalWrite (12 LOW);
zamudo (50);
}
}
void lampoff ()
{
// Delay (2000);
digitalWrite (ledPin, LOW);
}
// Akseleometr
izničijo ECOM ()
{
unsigned char val [3];
Število int = 0;
Val [0] = Val [1] = Val [2] = 64;
Wire.requestFrom (0x4c, 3); // Prosi 3 bajte iz naprave v slave načinu 0x4c
while (Wire.available ())
{
če (štetje 63) // polnitve
{
Val [število] = Wire.receive ();
}
štetje ++;
}
// Pretvori signal 7 bitov 8 bitov
Pospešek ret;
ret.x = ((char) (val [0] 2)) / 4;
ret.y = ((char) (val [1] 2)) / 4;
ret.z = ((char) (val [2], 2)) / 4;
ystate = ret.y;
xstate = ret.x;
Serial.print ("x =");
Serial.println (ret.x, DEC); //
Serial.print ("y =");
Serial.println (ret.y, DEC); //
Serial.print ("Z =");
Serial.println (ret.z, DEC); //
}
char branje = 0;
void loop ()
{
ECOM (); // Preverite stanje pospeška
digitalWrite (ledPin2HIGH);
buttonState = digitalRead (buttonPin); // Položaj Reading stikalo
če (buttonState == HIGH)
{
lampblink (); // LED zavijete na:
myservo.attach (9);
myservo2.attach (10);
VAL1 = ystate;
VAL1 = map (val130 -300.179);
myservo2.write (VAL1);
VAL2 = xstate;
VAL2 = map (VAL2 -30.300 179);
myservo.write (VAL2); // Nastavi servo položaj glede na ranzhyruemыm vrednosti
če (ystate thresholdvalue)
{
Serial.println ("DA");
// DigitalWrite (ledNoise, HIGH);
play_4 ();
// Lampoff ();
lampblink ();
servo1_no ();
servo1_no ();
servo1R ();
zamudo (1000);
}
ostalo
{
lampoff ();
}
// Preverjanje gibanju
int SensorValue = digitalRead (6); // Predlog Detector
če (SensorValue == 1)
{
Serial.println ("Move");
// Movestate = 1;
lampblink ();
// Servo2 ();
servo2_right ();
servo1_right ();
play_2 ();
zamudo (1000);
servo2_return ();
servo1_return ();
servo1_left ();
servo2_left ();
play_2 ();
zamudo (1000);
servo2_return ();
servo1_return ();
// Delay (1000);
}
ostalo
{
// DigitalWrite (ledNoise, LOW);
// Servo2 ();
servo1R ();
servo2R ();
lampoff ();
// Play_2 ();
// Movestate = 0;
}
}
}