Totalt 200 rubel för att köpa en bra grund för ett enkelt jobb. Projektet avslutades med utländska kollegor Adruino Arts. För genomförandet måste veta de grundläggande principerna för robotteknik, elektronik och förstå lite programmering.
I videoklippet författare till berättar och visar att vi borde få ett resultat.
Förutom lamporna behöver vi en uppsättning Grove - Toy Kit. Beställ online kan du handla efter pris 79.9 $.
Den huvudsakliga idén - definition av statiskt eller dynamiskt tillstånd av objektet genom rörelsedetektor. Om svaret är positivt, sedan köra en av ställdon och spela förinspelat meddelande. Annars aktiveras 2nd servo, och en annan ljudinspelning.
Bestämning av att gå igenom någon form av inmatning. Således får vi resultatet i binär kod 0 eller 1.
Recorder kan spela upp det inspelade ljudet endast 4 via en extern signal. För att spela in (varje 15 sek.), Är det nödvändigt att slå på knappen «play» att «rekord». Efter inspelningen knappen igen bör byta. Detta kan göras genom kod (funktionen play ()). I servokabel är 3 "plus", "minus" och den digitala datan. Den första 2 ger mat till servo (max 7) och 3: e ansluter till en digital utgång, som tar emot information om tillståndet i växeln och kod.
Först analyserad lampa. Vi behöver inte elektriska komponenter, men behöver arbeta mycket foundation. Du behöver också några rekvisita och stödelement.
Gör ett hål i röret för att ansluta vår design.
Prototypen roboten är klar!
Steg 1: Glöd
Använda LED-lampa IKEA Oleby (Food soldrivna).
Switchen fungerar bara i en digital enhet, och därför att det beror på det aktuella nätverket. Om vi byter podsoedynym Pay Seeeduino, kan du ställa in den digitala utgången LOW, och då blir det aktuellt. När du lägger HÖG, återkommer den.
Även inom lampan och vi koppla ett motstånd för att skydda LED.
Ställ ljuset element i metallbasen.
Steg 2: Princip
Vi har lampan bifogade servodetektor kontroll, trippel axel accelerometer, inspelare och spela fyra olika ljud.
Den grundläggande principen för lampan är som följer:
Det visar sig buller (ljud)
Ljuskälla
Körs rekord №3
Handlampa ger rörelse (vänster-höger-vänster)
Servo kvar i 90 °
Genomförd transaktion
Om det finns brus, då:
Ljuskälla
Servo med lampa flytta vänster
Körs rekord №2
Lampa tillbaka i position 90 °
Genomförd transaktion
Om metallarmen når en viss position (hög), sedan spela rekord №4.
Steg 3: Förbättring
I designarbetet kan göra vissa förbättringar som bädda en switch avgift Seeeduino, för att styra exekvering av kod med hjälp av en vanlig cykel IF. Om omkopplaren är påslagen - start läge auto, om inte - mode manual.
Auto-läget innehåller standardkoden när lampan reagerar på ljud.
Manuell-läget ger fjärrhantering via en trippel axel accelerometer, ändra läget på axlarna X och Y.
Du kan göra en sväng lampor på 360 °, lägga till ett separat servo. Kan jag ställa in att ansluta via Wi-Fi / Ethernet.
Steg 4: Kod
Författare kod (MrLdnr) finns nedan.
[Spoiler]
#include
const int buttonPin = 4; // Positionsbrytare
int buttonState = 0; // Variabel för läsning positionsknappar
// Servo Setup
Servo myservo2;
Servo myservo; // Skapar för servostyrning
int pos = 0; // Variabel för att lagra servoläge
int pos2 = 0; // Variabel för att lagra servoläge
int val1;
int val2;
// LED SETUP
const int ledPin2 = 5; // Huvud ljus
const int ledPin = 12; // Tube ljus
int countlamp2 = 0;
// Buller Setup
const int thresholdvalue = 300; // Svaret på ljud
// ställ 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
klass Acceleration
{
allmänheten:
char x;
char y;
röding z;
};
röding index;
char kontroll;
röding tillstånd;
int audiodelay = 1000;
void mma7660_init (void)
{
Wire.begin ();
Wire.beginTransmission (MMA766ddr);
Wire.send (MMA7660_MODE);
Wire.send (0x00);
Wire.endTransmission ();
Wire.beginTransmission (MMA766ddr);
Wire.send (MMA7660_SR);
Wire.send (0x07); // Prover / Second aktivt läge och Auto-Sleep
Wire.endTransmission ();
Wire.beginTransmission (MMA766ddr);
Wire.send (MMA7660_MODE);
Wire.send (0x01); // aktivt läge
Wire.endTransmission ();
}
void setup ()
{
mma7660_init (); // Gå i2c buss (adress selektiv masterenhet)
Serial.begin (9600);
// Rörelsesensor
pinMode (6 INPUT); // används 2 meter för extern signal
// Lampa ljus och bas ljus
pinMode (ledPin, OUTPUT);
pinMode (ledPin2 OUTPUT);
// Servon
// AUDIO
DDRD | = 0x0C; // D2 och D3 skriver i läge;
PORTD & = 0xF3; // D2 och D3 inställd på låg;
// Buller sensor på Analog 0
// SWITCH
pinMode (buttonPin, INPUT);
}
void rec_2_begin ()
{
PORTD = (PORTD | 0b00000100) & 0b11110111;
}
void rec_2_stop ()
{
PORTD & = 0xF3;
}
void play_2 ()
{
PORTD = (PORTD | 0b00000100) & 0b11110111;
fördröjning (audiodelay);
PORTD & = 0xF3;
}
////////////////////////////////////////////////// ////////////////////
////////////////////////////////////////////////// /////
// Funktion för att kontrollera segment_3
void rec_3_begin ()
{
PORTD = (PORTD | 0b00001000) & 0b11111011;
}
void rec_3_stop ()
{
PORTD & = 0xF3;
}
void play_3 ()
{
PORTD = (PORTD | 0b00001000) & 0b11111011;
fördröjning (audiodelay);
PORTD & = 0xF3;
}
////////////////////////////////////////////////// ///
////////////////////////////////////////////////
// Funktion för att kontrollera segment_4;
void rec_4_begin ()
{
PORTD = PORTD | 0b00001100;
}
void rec_4_stop ()
{
PORTD & = 0xF3;
}
void play_4 ()
{
PORTD = PORTD | 0b00001100;
fördröjning (audiodelay);
PORTD & = 0xF3;
}
//////////////////////
void check_move ()
{
int sensorValue = digitalRead (6);
if (sensorValue == 1)
{
// DigitalWrite (ledPin, HÖG);
//Serial.println(sensorValue, December); // output positionssignalen till bildskärmen.
// Servo1 ();
}
annars
{
// DigitalWrite (ledPin, LÅG);
//Serial.println(sensorValue, December); // output positionssignalen till bildskärmen.
// Servo2 ();
}
}
void servo1_right ()
{
myservo.attach (9);
för (pos = 90; pos = 90; möj- = 1) // går från 0 till 180 grader
{
myservo.write (pos); // Berättar servo position genom en variabel "pos"
fördröjning (10); // Väntar 15 ms tills servo tar positionen
} * /
}
void servo1_left ()
{
myservo.attach (9);
för (pos = 90; pos & gt; 1; pos - = 1) // går från 0 till 180 grader
{// Steg om 1 grad
myservo.write (pos); // Berättar servo position genom en variabel "pos"
fördröjning (10); // Waits för 15 ms, medan servo inte tar ställning
} / *
play_2 ();
fördröjning (1000);
för (pos = 1; pos90) {
för (pos = posact, pos & gt; 90, pos - = 1) // returnerar 90 grader
{// Steg om 1 grad
myservo.write (pos); // Berättar servo position genom en variabel "pos"
fördröjning (10); // Waits för 15 ms, medan servo inte tar ställning
}
}
else {
för (pos = posact, pos 60, pos - = 1) // går från 0 till 180 grader
{// Steg om 1 grad
myservo2.write (pos); // Berättar servo position genom en variabel "pos"
fördröjning (10); // Waits för 15 ms, medan servo inte tar ställning
} / *
play_2 ();
fördröjning (1000);
för (pos = 1; pos90) {
för (pos = posact, pos & gt; 90, pos - = 1) // returnerar positionen för 90 grader
{// Steg om 1 grad
myservo2.write (pos); // Berättar servo position genom en variabel "pos"
fördröjning (10); // Waits för 15 ms, medan servo inte tar ställning
}
}
else {
för (pos = posact; pos<=90 ;="" pos="" +="1)" goes="" from="" 0="" degrees="" to="" 180="">
{// Steg om 1 grad
myservo2.write (pos); // Berättar servo position genom en variabel "pos"
fördröjning (10); // Waits för 15 ms, medan servo inte tar ställning
}
}
}
void servo1_no ()
{
myservo.attach (9);
för (pos = 90; pos = 90; möj- = 1) // går 180-0 grader
{
myservo.write (pos); // Berättar servo position genom en variabel "pos"
fördröjning (10); // Waits för 15 ms, medan servo inte tar ställning
}
}
void servo2 ()
{
myservo2.attach (10);
för (pos2 = 110; pos2< 140;="" pos2="" +="1)" ="" 0="" ="" 180="">
{//
myservo2.write (pos2); // Berättar servo position genom en variabel "pos"
fördröjning (15); // Waits för 15 ms, medan servo inte tar ställning
}
}
annullera servo1R ()
{
myservo.write (90);
myservo.detach ();
}
annullera servo2R ()
{
myservo2.write (90);
myservo2.detach ();
}
void lampblink ()
{
// Int sensorValue = digitalRead (6);
// Om (sensorValue 1 =) {
digitalWrite (ledPin, HÖG);
// Delay (1);
// DigitalWrite (ledPin, LÅG);
// Delay (1);
//}
// Else
// DigitalWrite (ledPin, LÅG);
}
void larmprov ()
{
for (int i = 0; i<100;>
{
digitalWrite (12 HÖG);
fördröjning (50);
digitalWrite (12 LÅG);
fördröjning (50);
}
}
void lampoff ()
{
// Delay (2000);
digitalWrite (ledPin, LÅG);
}
// Akseleometr
annullera Ecom ()
{
unsigned char val [3];
int count = 0;
val [0] = val [1] = val [2] = 64;
Wire.requestFrom (0x4c, 3); // Ber 3 byte från enheten i slavläge 0x4c
medan (Wire.available ())
{
Om (räkna 63) // laddar
{
val [count] = Wire.receive ();
}
räkna ++;
}
// Omvandlar signalen av 7 bitar 8 bitar
Acceleration 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, december); //
Serial.print ("y =");
Serial.println (ret.y, december); //
Serial.print ("z =");
Serial.println (ret.z, december); //
}
char läsning = 0;
void slinga ()
{
Ecom (); // Kontrollera status för accelerometern
digitalWrite (ledPin2HIGH);
buttonState = digitalRead (buttonPin); // Läsa lägesbrytare
if (buttonState == HÖG)
{
lampblink (); // sväng LED på:
myservo.attach (9);
myservo2.attach (10);
val1 = ystate;
val1 = karta (val130 -300.179);
myservo2.write (val1);
val2 = xstate;
val2 = karta (val2 -30.300 179);
myservo.write (val2); // Ställer servoläget enligt värdet ranzhyruemыm
if (ystate thresholdvalue)
{
Serial.println ("JA");
// DigitalWrite (ledNoise, HÖG);
play_4 ();
// Lampoff ();
lampblink ();
servo1_no ();
servo1_no ();
servo1R ();
fördröjning (1000);
}
annars
{
lampoff ();
}
// Kontroll av rörelse
int sensorValue = digitalRead (6); // Rörelsedetektor
if (sensorValue == 1)
{
Serial.println ("Flytta");
// Movestate = 1;
lampblink ();
// Servo2 ();
servo2_right ();
servo1_right ();
play_2 ();
fördröjning (1000);
servo2_return ();
servo1_return ();
servo1_left ();
servo2_left ();
play_2 ();
fördröjning (1000);
servo2_return ();
servo1_return ();
// Delay (1000);
}
annars
{
// DigitalWrite (ledNoise, LÅG);
// Servo2 ();
servo1R ();
servo2R ();
lampoff ();
// Play_2 ();
// Movestate = 0;
}
}
}
