Toplam 200 ruble basit bir iş için iyi bir temel satın almak. Proje, yabancı meslektaşları Adruino Sanat ile tamamlandı. Uygulanması için robotik, elektronik temel ilkelerini bilmek ve biraz programlama anlamak gerekir.
Video klip yazar söyler ve bir sonuç almak gerektiğini göstermektedir.
Oyuncak Kit - lambalar ek olarak Grove bir dizi gerekir. Sipariş online fiyat 79,9 $ ile alışveriş yapabilirsiniz.
Ana fikir - hareket algılama ile nesnenin statik veya dinamik devletin tanımı. Cevap olumlu ise, o zaman tahrik birini çalıştırın ve önceden kaydedilmiş mesajı oynatma. Aksi takdirde, 2. servo ve farklı bir ses kaydı aktif.
Girdi çeşit geçiyor belirlenmesi. Böylece, biz ikili kod 0 veya 1 sonucu almak.
Kaydedici harici bir sinyal ile kaydedilen sesi sadece 4 oynatabilirsiniz. (Her 15 sn.) Kaydetmek için, bu «rekor» düğme «oyun» açmak için gereklidir. Geçmelisiniz düğmesine tekrar kaydettikten sonra. Bu kod ile yapılabilir (fonksiyon çalma ()). Servo kablosu 3 "artı", "eksi" ve dijital veriler. İlk 2 anahtarının durumu hakkında ve kod aldığı bilgileri servo (max 7) ve 3 dijital çıkışına bağlanır, yiyecek sağlamak.
İlk lamba çözümlü. Biz elektrik bileşenleri ihtiyacımız, ama çok temel çalışması gerekmez. Ayrıca bazı sahne ve destekleyici unsurları gerekir.
Bizim tasarım bağlamak için tüp içinde bir delik açın.
prototip robot hazır!
Adım 1: Kızdırma
LED lamba IKEA OLEBY Kullanma (Gıda güneş enerjili).
anahtar, sadece bir sayısal cihaza çalışır ve bu nedenle, mevcut ağ bağlıdır. Biz podsoedynym Öde Seeeduino geçerseniz, dijital çıkış DÜŞÜK ayarlayabilirsiniz, ve sonra geçerli olacak. YÜKSEK koyarak, bu görüntülenir.
Hatta lamba içinde ve biz LED korumak için bir direnç takın.
Metal tabanı ışık elemanı ayarlayın.
Adım 2: İlke
Biz lamba takılı servo dedektörü kontrolü, üçlü eksen ivmeölçer, kaydedici ve 4 farklı sesler oynarlar.
aşağıdaki gibi lambanın temel ilkedir:
Bu gürültü (ses) çıkıyor
Lamba dahil
Skor rekor №3
El Lambası hareketini sağlayan (sol-sağ sol)
Servo 90 ° kalır
Tamamlanan işlem
Sonra gürültü varsa:
Lamba dahil
Lamba hareket Servo sol
Skor rekor №2
Pozisyon geri 90 ° Lamp
Tamamlanan işlem
Metal kol belli bir (yüksek) konum ulaşırsa, o zaman kayıt №4 oynuyor.
Adım 3: İyileştirme
Tasarım çalışmaları düzenli bir döngü IF kullanarak kod yürütülmesine kontrol etmek, bir geçiş ücreti Seeeduino gömme gibi bazı iyileştirmeler yapabilirsiniz. Anahtar açıksa - mod kılavuzu - değilse mod otomatik başlar.
Lamba ses yanıt Auto modu standart kodu.
Manuel mod eksenleri X ve Y konumunu değiştirerek, bir üçlü eksen ivme ile uzaktan yönetim olanağı sağlar
Bunu ayrı bir servo ekleyerek, 360 ° bir dönüş ışıkları yapabilirsiniz. Ben Wi-Fi / Ethernet yoluyla bağlamak için kurulmuş Can.
Adım 4: Kod
Yazar kodu (MrLdnr) aşağıda bulabilirsiniz.
[Spoiler]
#include
#define buttonPin = 4; // Konum anahtarı
int buttonState = 0; // Pozisyon düğmeleri okumak için Değişken
// Servo Kurulumu
Servo myservo2;
Servo myservo; // Servo kontrolü için oluşturur
int pos = 0; // Değişken servo konumunu saklamak için
int POS2 = 0; // Değişken servo konumunu saklamak için
int val1;
int val2;
// LED AYAR
#define ledPin2 = 5; // Ana ışık
#define ledPin = 12; // Boru ışık
int countlamp2 = 0;
// Gürültü Ayarı
#define thresholdvalue = 300; // ses yanıtı
// 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
sınıf Hızlanma
{
Kamu:
karakter x;
y ateşinde;
Char z;
};
Char indeksi;
Char kontrol;
Char devlet;
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); // Örnekleri / İkinci Aktif Modu ve Otomatik Uyku
Wire.endTransmission ();
Wire.beginTransmission (MMA766ddr);
Wire.send (MMA7660_MODE);
Wire.send (0x01); // aktif mod
Wire.endTransmission ();
}
void setup ()
{
mma7660_init (); // I2c otobüs (adres seçici master cihaz) Katıl
Serial.begin (9600);
// Hareket Sensörü
pinMode (6 GİRİŞ); // dış sinyal için 2 ayak kullanılır
// Lamba ışığı ve taban ışık
pinMode (ledPin, ÇIKIŞ);
pinMode (ledPin2 ÇIKIŞI);
// Servolar
// SES
DDRD | = 0x0C; // D2 ve D3 modunda yazma;
PORTD & = 0xF3; // D2 ve D3 düşüğe ayarlayın;
// Analog 0 Gürültü sensörü
// ANAHTARI
pinMode (buttonPin, GİRİŞ);
}
void rec_2_begin ()
{
PORTD = (PORTD | 0b00000100) 0b11110111;
}
void rec_2_stop ()
{
PORTD & = 0xF3;
}
void play_2 ()
{
PORTD = (PORTD | 0b00000100) 0b11110111;
gecikme (audiodelay);
PORTD & = 0xF3;
}
////////////////////////////////////////////////// ////////////////////
////////////////////////////////////////////////// /////
// Işlev segment_3 kontrol etmek için
void rec_3_begin ()
{
PORTD = (PORTD | 0b00001000) 0b11111011;
}
void rec_3_stop ()
{
PORTD & = 0xF3;
}
void play_3 ()
{
PORTD = (PORTD | 0b00001000) 0b11111011;
gecikme (audiodelay);
PORTD & = 0xF3;
}
////////////////////////////////////////////////// ///
////////////////////////////////////////////////
// Fonksiyon segment_4 kontrol etmek;
void rec_4_begin ()
{
PORTD = PORTD | 0b00001100;
}
void rec_4_stop ()
{
PORTD & = 0xF3;
}
void play_4 ()
{
PORTD = PORTD | 0b00001100;
gecikme (audiodelay);
PORTD & = 0xF3;
}
//////////////////////
void check_move ()
{
int sensorValue = digitalRead (6);
Eğer (sensorValue == 1)
{
// DigitalWrite (ledPin, YÜKSEK);
//Serial.println(sensorValue, Aralık); // output monitöre konum sinyali.
// Servo1 ();
}
başka
{
// DigitalWrite (ledPin, DÜŞÜK);
//Serial.println(sensorValue, Aralık); // output monitöre konum sinyali.
// Servo2 ();
}
}
void servo1_right ()
{
myservo.attach (9);
için (pos = 90; pos = 90; POS- = 1) // 0 180 derece arasında gider
{
myservo.write (poz); // Değişken 'pos' aracılığıyla servo konumunu söyler
Gecikme (10); Servo konumunu alır kadar // 15 ms bekler
} * /
}
void servo1_left ()
{
myservo.attach (9);
(, pos & gt; 1; pos = 90 pos - = 1) için // 0 180 derece arasında gider
{// 1 derece Artım
myservo.write (poz); // Değişken 'pos' aracılığıyla servo konumunu söyler
Gecikme (10); Servo bir pozisyon almaz ise //, 15 ms için bekler
} / *
play_2 ();
Gecikme (1000);
için (pos = 1; pos90) {
için (, pos & gt; 90; pos = posact pos - = 1) 90 derece döndürür //
{// 1 derece Artım
myservo.write (poz); // Değişken 'pos' aracılığıyla servo konumunu söyler
Gecikme (10); Servo bir pozisyon almaz ise //, 15 ms için bekler
}
}
else {
// 0 180 derece arasında gider - (;, pos 60 = 1 pos pos = posact) için
{// 1 derece Artım
myservo2.write (poz); // Değişken 'pos' aracılığıyla servo konumunu söyler
Gecikme (10); Servo bir pozisyon almaz ise //, 15 ms için bekler
} / *
play_2 ();
Gecikme (1000);
için (pos = 1; pos90) {
için (, pos & gt; 90; pos = posact pos - = 1) 90 derece konumunu döndürür //
{// 1 derece Artım
myservo2.write (poz); // Değişken 'pos' aracılığıyla servo konumunu söyler
Gecikme (10); Servo bir pozisyon almaz ise //, 15 ms için bekler
}
}
else {
poz (pos = posact için<=90 ;="" pos="" +="1)" goes="" from="" 0="" degrees="" to="" 180="">=90>
{// 1 derece Artım
myservo2.write (poz); // Değişken 'pos' aracılığıyla servo konumunu söyler
Gecikme (10); Servo bir pozisyon almaz ise //, 15 ms için bekler
}
}
}
void servo1_no ()
{
myservo.attach (9);
için (pos = 90; pos = 90; POS- = 1) // 180 0 dereceye gider
{
myservo.write (poz); // Değişken 'pos' aracılığıyla servo konumunu söyler
Gecikme (10); Servo bir pozisyon almaz ise //, 15 ms için bekler
}
}
void servo2 ()
{
myservo2.attach (10);
Pos2 (POS2 = 110< 140;="" pos2="" +="1)" ="" 0="" ="" 180="">
{//
myservo2.write (POS2); // Değişken 'pos' aracılığıyla servo konumunu söyler
gecikme (15); Servo bir pozisyon almaz ise //, 15 ms için bekler
}
}
) (servo1R geçersiz
{
myservo.write (90);
myservo.detach ();
}
) (servo2R geçersiz
{
myservo2.write (90);
myservo2.detach ();
}
void lampblink ()
{
// Orta sensorValue = digitalRead (6);
// Eğer (sensorValue = 1) {
digitalWrite (ledPin, YÜKSEK);
// Gecikmesi (1);
// DigitalWrite (ledPin, DÜŞÜK);
// Gecikmesi (1);
//}
// Else
// DigitalWrite (ledPin, DÜŞÜK);
}
void lamptest ()
{
(0 = int i; i<100;>100;>
{
digitalWrite (12 YÜKSEK);
gecikme (50);
digitalWrite (12 DÜŞÜK);
gecikme (50);
}
}
void lampoff ()
{
// Gecikme (2000);
digitalWrite (ledPin, DÜŞÜK);
}
// Akseleometr
) (ECOM geçersiz
{
unsigned char val [3];
int sayısı = 0;
val [0] = val [1] = val [2] 64 =;
Wire.requestFrom (0x4c, 3); // Köle modunda 0x4c cihazdan 3 bayt İstedi
ise (Wire.available ())
{
(63 sayı) // yeniden yüklenip
{
val [sayım] = Wire.receive ();
}
++ saymak;
}
// 7 bit 8 bit sinyali dönüştürür
İvme 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, Aralık); //
Serial.print ("y =");
Serial.println (ret.y, Aralık); //
Serial.print ("z =");
Serial.println (ret.z, Aralık); //
}
karakter okuma = 0;
void loop ()
{
ECom (); // Ivme durumunu kontrol
digitalWrite (ledPin2HIGH);
buttonState = digitalRead (buttonPin); // Okuma konum anahtarı
if (buttonState == YÜKSEK)
{
lampblink (); LED dönün //:
myservo.attach (9);
myservo2.attach (10);
val1 = ystate;
val1 = harita (val130 -300.179);
myservo2.write (val1);
val2 = xstate;
val2 = harita (val2 -30.300 179);
myservo.write (val2); // Değer ranzhyruemыm göre servo konumunu belirler
if (ystate thresholdvalue)
{
Serial.println ("EVET");
// DigitalWrite (ledNoise, YÜKSEK);
play_4 ();
// Lampoff ();
lampblink ();
servo1_no ();
servo1_no ();
servo1R ();
Gecikme (1000);
}
başka
{
lampoff ();
}
// Hareket denetleniyor
int sensorValue = digitalRead (6); // Hareket Dedektörü
Eğer (sensorValue == 1)
{
Serial.println ("Taşı");
// Movestate = 1 'dir;
lampblink ();
// Servo2 ();
servo2_right ();
servo1_right ();
play_2 ();
Gecikme (1000);
servo2_return ();
servo1_return ();
servo1_left ();
servo2_left ();
play_2 ();
Gecikme (1000);
servo2_return ();
servo1_return ();
// Gecikmesi (1000);
}
başka
{
// DigitalWrite (ledNoise, DÜŞÜK);
// Servo2 ();
servo1R ();
servo2R ();
lampoff ();
// Play_2 ();
// Movestate = 0;
}
}
}
