http://poradumo.pp.ua

Online Журнал-Світ порад.
Головна сторінка
» » Модернізована лампа-робот з IKEA

Модернізована лампа-робот з IKEA



Модернізована лампа-робот з IKEA

Модернізована лампа-робот з IKEA

Модернізована лампа-робот з IKEA

Модернізована лампа-робот з IKEA

Модернізована лампа-робот з IKEA

Модернізована лампа-робот з IKEA

Модернізована лампа-робот з IKEA

Модернізована лампа-робот з IKEA

Модернізована лампа-робот з IKEA

Модернізована лампа-робот з IKEA

Модернізована лампа-робот з IKEA

Модернізована лампа-робот з IKEA

Модернізована лампа-робот з IKEA

Модернізована лампа-робот з IKEA

Модернізована лампа-робот з IKEA

Модернізована лампа-робот з IKEA



Всього за 200 рублів можна купити необхідну основу для простого робота. Проект виконаний зарубіжними колегами з Adruino Arts. Для його реалізації необхідно знати базові принципи робототехніки, розбиратися в радіоелектроніці і трохи в програмуванні.

У відео ролику автор проекту розповідає і показує, що повинне вийти у нас в підсумку.

Крім самої лампи нам буде потрібно набір Grove - Toy Kit. Замовити його можна в онлайн-магазині за ціною 79.9$.

Головна ідея - визначення статичного або динамічного стану об'єкта за рахунок детектора руху. Якщо відповідь позитивний, то запускається один з сервоприводів і відтворення заздалегідь записане повідомлення. В іншому випадку, активується 2-ой сервопривід, і звучить вже інша запис.

Визначення положення відбувається через той чи інший вид вхідного сигналу. Відповідно, результат ми отримаємо в двійковому коді: 0 або 1.

Диктофон може програвати тільки 4 записаних звуку через зовнішній сигнал. Щоб зробити запис (кожна по 15 сек.), необхідно переключитися з кнопки «play» на «record». Після запису кнопки знову повинні переключитися. Це можна здійснити через програмний код (функція play()). У сервоприводів є 3 кабелю: «плюс», «мінус» і від цифрових даних. Перші 2 забезпечують харчування для сервоприводу (максимально на 7), а 3-ій з'єднується з цифровим виходом, де надходить інформація про стан перемикача також за допомогою коду.
Спочатку розбираємо лампу. Нам не потрібні електричні компоненти, але потрібна сама основа для робота. Також потрібно підпірки і деякі підтримуючі елементи.

Робимо отвір у лампі, щоб приєднати нашу конструкцію.

Прототип робота готовий!


Модернізована лампа-робот з IKEA

Модернізована лампа-робот з IKEA

Модернізована лампа-робот з IKEA

Модернізована лампа-робот з IKEA

Модернізована лампа-робот з IKEA

Модернізована лампа-робот з IKEA

Модернізована лампа-робот з IKEA

Модернізована лампа-робот з IKEA

Модернізована лампа-робот з IKEA

Модернізована лампа-робот з IKEA

Модернізована лампа-робот з IKEA

Модернізована лампа-робот з IKEA

Модернізована лампа-робот з IKEA

Модернізована лампа-робот з IKEA

Модернізована лампа-робот з IKEA

Модернізована лампа-робот з IKEA

Модернізована лампа-робот з IKEA

Модернізована лампа-робот з IKEA

Модернізована лампа-робот з IKEA

Модернізована лампа-робот з IKEA


Крок 1: Світіння

Використовуємо світлодіодну лампу IKEA OLEBY (харчування на сонячних батареях).

Перемикач працює тільки у вигляді цифрового пристрою, а, отже, він залежний від струму в мережі. Якщо ми подсоединим перемикач з платою Seeeduino, то можна виставити на цифровому виході LOW, і тоді не буде струму. А коли виставляємо HIGH, то він знову з'являється.
Вже всередині самої лампи ми під'єднуємо кабелі і резистор для захисту світлодіода.

Встановлюємо світловий елемент в металеву основу.


Модернізована лампа-робот з IKEA


Крок 2: Принцип

У нас є лампа, приєднані сервоприводи, детектор контролю, потрійний осьовий акселерометр, пристрій запису і програвання 4-х різних звуків.

Основний принцип роботи лампи полягає в наступному:



Виявляється шум (звук)




Лампа включається




Запускається запис №3




Рука лампи здійснює рух (вліво-вправо-вліво)




Сервопривід залишається під кутом 90°




Завершується операція




Якщо виявлено шум, тоді:



Лампа включається




Сервопривід разом з лампою рухаються вліво




Запускається запис №2




Лампа повертається в позицію під кутом 90°




Завершується операція




Якщо металева рука досягає певного (найвищого) положення, то програється запис №4.


Модернізована лампа-робот з IKEA

Модернізована лампа-робот з IKEA

Модернізована лампа-робот з IKEA

Модернізована лампа-робот з IKEA

Модернізована лампа-робот з IKEA

Модернізована лампа-робот з IKEA

Модернізована лампа-робот з IKEA

Модернізована лампа-робот з IKEA

Модернізована лампа-робот з IKEA


Крок 3: Поліпшення

У конструкцію робота можна внести деякі удосконалення, як вбудовування перемикача в плату Seeeduino, щоб контролювати запуск програмного коду за допомогою звичайного циклу IF. Якщо перемикач включений - запустити режим auto, якщо немає - режим manual.
Auto-режим включає в себе стандартний код, коли лампа реагує на звук.

Manual-режим передбачає віддалене управління через потрійний осьовий акселерометр, змінюючи положення по осях X і Y.

Можна зробити поворот лампи на 360°, додавши для неї окремий сервопривід. Чи можна налаштувати підключення через Wi-Fi/Ethernet.

Крок 4: Код

Авторський код (MrLdnr) можна посмитися нижче.
[spoiler]
#include
const int buttonPin = 4; //положення перемикача
int buttonState = 0; //змінна для читання положення кнопки

//Servo Setup

Servo myservo2;
Servo myservo; //створює сервопривід для контролю
int pos = 0; //змінна для зберігання позиції сервоприводу
int pos2 = 0; //змінна для зберігання позиції сервоприводу
int val1;
int val2;

//LED SETUP

const int ledPin2=5;//Основне світло
const int ledPin=12;//Ламповий світло

int countlamp2 = 0;

//Noise Setup

const int thresholdvalue=300;//Реакція на звук

//Установка акселеометра

int ystate;
int xstate;

#include

#define MMA7660addr 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

class Acceleration
{
public:
char x;
char y;
char z;
};


char index;
char control;
char state;

int audiodelay=1000;

void mma7660_init(void)
{
Wire.begin();
Wire.beginTransmission( MMA7660addr);
Wire.send(MMA7660_MODE);
Wire.send(0x00);
Wire.endTransmission();

Wire.beginTransmission( MMA7660addr);
Wire.send(MMA7660_SR);
Wire.send(0x07); //Samples/Second Active і режим Auto-Sleep
Wire.endTransmission();

Wire.beginTransmission( MMA7660addr);
Wire.send(MMA7660_MODE);
Wire.send(0x01);//active mode
Wire.endTransmission();

}


void setup()
{
mma7660_init(); //join i2c bus (вибірковий адреса для майстер-пристрої)
Serial.begin(9600);
//Motion Sensor
pinMode(6 INPUT);//Використовуються 2 ніжки для отримання зовнішнього сигналу
//Lamp light and base light
pinMode(ledPin, OUTPUT);
pinMode(ledPin2 OUTPUT);
//SERVOS

//AUDIO
DDRD |= 0x0C; //D2 and D3 write in mode;
PORTD &= 0xF3; //D2 and D3 set to low;
//Noise sensor on 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;
delay(audiodelay);
PORTD &= 0xF3;
}
//////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////
//function to control the segment_3
void rec_3_begin()
{
PORTD = (PORTD | 0b00001000)&0b11111011;
}
void rec_3_stop()
{
PORTD &= 0xF3;
}
void play_3()
{
PORTD = (PORTD | 0b00001000)&0b11111011;
delay(audiodelay);
PORTD &= 0xF3;
}
/////////////////////////////////////////////////////
////////////////////////////////////////////////
//function to control the segment_4;
void rec_4_begin()
{
PORTD = PORTD | 0b00001100;
}
void rec_4_stop()
{
PORTD &= 0xF3;
}
void play_4()
{
PORTD = PORTD | 0b00001100;
delay(audiodelay);
PORTD &= 0xF3;
}
//////////////////////


void check_move()
{
int sensorValue = digitalRead(6);
if(sensorValue==1)
{
//digitalWrite(ledPin,HIGH);
//Serial.println(sensorValue, DEC);//Вивід положення сигналу на монітор.
//servo1();

}
else
{
//digitalWrite(ledPin,LOW);
//Serial.println(sensorValue, DEC);//Вивід положення сигналу на монітор.
//servo2();
}
}

void servo1_right()
{
myservo.attach(9);
for(pos = 90; pos =90; pos-=1) //йде від 0 до 180 градусів
{
myservo.write(pos); //повідомляє сервоприводу позицію через змінну 'pos'
delay(10); //чекає 15 мс, поки не сервопривід займе позицію
}*/
}
void servo1_left()
{
myservo.attach(9);
for(pos = 90; pos > 1; pos -= 1) //йде від 0 до 180 градусів
{//з кроком в 1 градус
myservo.write(pos); //повідомляє сервоприводу позицію через змінну 'pos'
delay(10); //чекає 15 мс, поки сервопривід не займе позицію
}/*
play_2();
delay(1000);
for(pos = 1; pos90){
for(pos = posact; pos > 90; pos -= 1) //повертає до 90 градусів
{//з кроком в 1 градус
myservo.write(pos); //повідомляє сервоприводу позицію через змінну 'pos'
delay(10); //чекає 15 мс, поки сервопривід не займе позицію
}
}
else {
for(pos = posact; pos 60; pos -= 1) //йде від 0 до 180 градусів
{//з кроком в 1 градус
myservo2.write(pos); //повідомляє сервоприводу позицію через змінну 'pos'
delay(10); //чекає 15 мс, поки сервопривід не займе позицію
}/*
play_2();
delay(1000);
for(pos = 1; pos90){
for(pos = posact; pos > 90; pos -= 1) //повертає положення 90 градусів
{//з кроком в 1 градус
myservo2.write(pos); //повідомляє сервоприводу позицію через змінну 'pos'
delay(10); //чекає 15 мс, поки сервопривід не займе позицію
}
}
else {
for(pos = posact; pos <=90 ; pos += 1) //goes from 0 degrees to 180 degrees
{//з кроком в 1 градус
myservo2.write(pos); //повідомляє сервоприводу позицію через змінну 'pos'
delay(10); //чекає 15 мс, поки сервопривід не займе позицію
}
}
}




void servo1_no()
{
myservo.attach(9);
for(pos = 90; pos =90; pos-=1) //йде від 180 до 0 градусів
{
myservo.write(pos); //повідомляє сервоприводу позицію через змінну 'pos'
delay(10); //чекає 15 мс, поки сервопривід не займе позицію
}
}

void servo2()
{
myservo2.attach(10);
for(pos2 = 110; pos2 < 140; pos2 += 1) //от 0 до 180 градусов
{//
myservo2.write(pos2); //повідомляє сервоприводу позицію через змінну 'pos'
delay(15); //чекає 15 мс, поки сервопривід не займе позицію
}

}



void servo1R()
{
myservo.write(90);
myservo.detach();

}
void servo2R()
{
myservo2.write(90);
myservo2.detach();
}

void lampblink()
{
//int sensorValue = digitalRead(6);
//if (sensorValue =1){
digitalWrite(ledPin,HIGH);
//delay (1);
//digitalWrite(ledPin,LOW);
//delay (1);
//}
//else
//digitalWrite(ledPin,LOW);
}
void lamptest()
{

for (int i=0; i <100; i++)
{
digitalWrite(12 HIGH);
delay(50);
digitalWrite(12 LOW);
delay(50);
}
}

void lampoff()
{
//delay (2000);
digitalWrite (ledPin, LOW);
}

//акселеометр

void Ecom()
{
unsigned char val[3];
int count = 0;
val[0]= val[1]= val[2]= 64;
Wire.requestFrom(0x4c, 3); //запитує 3 байти від пристрою в slave-режимі 0x4c

while(Wire.available())
{
if(count 63 ) //перезавантажує
{
val[count]= Wire.receive();

}
count++;
}

//перетворює сигнал з 7 біт 8 біт
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,DEC); //

Serial.print("y = ");
Serial.println(ret.y,DEC); //

Serial.print("z = ");
Serial.println(ret.z,DEC); //
}

char reading = 0;



void loop()
{

Ecom(); //перевірка стану акселерометра
digitalWrite(ledPin2HIGH);
buttonState = digitalRead(buttonPin); //читання положення перемикача

if (buttonState == HIGH)
{
lampblink();//turn LED on:
myservo.attach(9);
myservo2.attach(10);
val1 = ystate;
val1 = map(val130 -300179);
myservo2.write(val1);
val2 = xstate;
val2 = map(val2 -30300 179);
myservo.write(val2); //встановлює позицію сервоприводу відповідно до ранжируемим значенням

if (ystate thresholdvalue)
{
Serial.println("YES");
//digitalWrite(ledNoise,HIGH);
play_4();
//lampoff();
lampblink();
servo1_no();
servo1_no();
servo1R();
delay(1000);
}
else
{
lampoff();
}
//checking for motion
int sensorValue = digitalRead(6); //детектор руху
if(sensorValue==1)
{
Serial.println("Move");
//movestate =1;
lampblink();
//servo2();
servo2_right();
servo1_right();
play_2();
delay (1000);
servo2_return();
servo1_return();
servo1_left();
servo2_left();
play_2();
delay (1000);
servo2_return();
servo1_return();
//delay(1000);
}
else
{
//digitalWrite(ledNoise,LOW);
//servo2();
servo1R();
servo2R();
lampoff();
//play_2();
//movestate =0;

}

}
}
of your page -->

Популярні поради

загрузка...