IKEA Robot lampan (4 / 4 steg)
Steg 4: Koden
Koden:Här är den första versión i koden, behöver en hel del förbättringar. Det finns vissa bibliotek i´m inte med på huvudloop, men kan användas för att ändra beteendet hos lampan.
Så njut! ;-)
/ * För SeeedStudio leksak hacka tävlingen
Base don exemplen av rörelsesensorn, aningen sensor, knopp servo och andra.
www.arduinoarts.com * /
#include < Servo.h >
CONST int buttonPin = 4; Växla staten
int buttonState = 0; variabel för att läsa tryckknapp status
Servo Setup
Servo myservo2;
Servo myservo; skapa objekt för att styra en servo servo
int pos = 0; variabel att lagra servo position
int pos2 = 0; variabel att lagra servo position
int värde1;
int värde2;
INSTALLATIONSPROGRAMMET FÖR LED
CONST int ledPin2 = 5; //Base ljus
CONST int ledPin = 12; //Lamp ljus
int countlamp2 = 0; Antal slingor på servo
Installationsprogrammet för buller
CONST int thresholdvalue = 300; //The tröskel buller svar
Accelerometer SETUP
int ystate;
int xstate;
#include < Wire.h >
#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
klass Acceleration
{
offentlig:
char x;
char y;
char z;
};
char index.
char kontroll;
char staten.
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); Prover/andra aktiva och Auto-viloläge
Wire.endTransmission();
Wire.beginTransmission (MMA7660addr);
Wire.send(MMA7660_MODE);
Wire.send (0x01); //active läge
Wire.endTransmission();
}
void setup()
{
mma7660_init(); gå med i2c bussen (adress valfritt för master)
Serial.BEGIN(9600);
Motion Sensor
pinMode (6, ingång); //Use stift 2 att ta emot signalen utdata av modulen
Lykta ljus och bas ljus
pinMode (ledPin, produktionen);
pinMode (ledPin2, produktionen);
SERVON
LJUD
DDRD | = 0X0C; D2 och D3 i skrivläge;
PORTD & = 0xF3; D2 och D3 som till låg;
Brus sensor på Analog 0
SWITCH
pinMode (buttonPin, ingång);
}
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;
}
//////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////
funktion för att styra 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;
}
/////////////////////////////////////////////////////
////////////////////////////////////////////////
funktion för att styra 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); //Print tillståndet för signalen genom seriella bildskärmen.
servo1();
}
annat
{
digitalWrite(ledPin,LOW);
Serial.println (sensorValue, DEC); //Print tillståndet för signalen genom seriella bildskärmen.
servo2();
}
}
void servo1_right()
{
myservo.attach(9);
för (pos = 90; pos < 180; pos + = 1) / / går från 0 grader till 180 grader
{/ / i steg om 1 grad
myservo.write(POS); berätta servo gå för att placera i variabel "pos"
Delay(10); Waits 15 MS för servo att nå ställning
}
/ * play_2();
Delay(1000);
för (pos = 180, pos > = 90; pos-= 1) / / går från 180 grader till 0 grader
{
myservo.write(POS); berätta servo gå för att placera i variabel "pos"
Delay(10); Waits 15 MS för servo att nå ställning
}*/
}
void servo1_left()
{
myservo.attach(9);
för (pos = 90; pos > 1; pos-= 1) / / går från 0 grader till 180 grader
{/ / i steg om 1 grad
myservo.write(POS); berätta servo gå för att placera i variabel "pos"
Delay(10); Waits 15 MS för servo att nå ställning
}/*
play_2();
Delay(1000);
för (pos = 1; pos < = 90; pos + = 1) / / går från 180 grader till 0 grader
{
myservo.write(POS); berätta servo gå för att placera i variabel "pos"
Delay(10); Waits 15 MS för servo att nå ställning
}*/
}
void servo1_return()
{
myservo.attach(9);
int posact = myservo.read();
om (myservo.read() > 90) {
för (pos = posact; pos > 90; pos-= 1) / / tillbaka till 90
{/ / i steg om 1 grad
myservo.write(POS); berätta servo gå för att placera i variabel "pos"
Delay(10); Waits 15 MS för servo att nå ställning
}
}
annat {
för (pos = posact; pos < = 90; pos + = 1) / / går från 0 grader till 180 grader
{/ / i steg om 1 grad
myservo.write(POS); berätta servo gå för att placera i variabel "pos"
Delay(10); Waits 15 MS för servo att nå ställning
}
}
}
void servo2_right()
{
myservo2.attach(10);
för (pos = 90; pos < 120; pos + = 1) / / går från 0 grader till 180 grader
{/ / i steg om 1 grad
myservo2.write(POS); berätta servo gå för att placera i variabel "pos"
Delay(10); Waits 15 MS för servo att nå ställning
}
/ * play_2();
Delay(1000);
för (pos = 180, pos > = 90; pos-= 1) / / går från 180 grader till 0 grader
{
myservo.write(POS); berätta servo gå för att placera i variabel "pos"
Delay(10); Waits 15 MS för servo att nå ställning
}*/
}
void servo2_left()
{
myservo2.attach(10);
för (pos = 90; pos > 60; pos-= 1) / / går från 0 grader till 180 grader
{/ / i steg om 1 grad
myservo2.write(POS); berätta servo gå för att placera i variabel "pos"
Delay(10); Waits 15 MS för servo att nå ställning
}/*
play_2();
Delay(1000);
för (pos = 1; pos < = 90; pos + = 1) / / går från 180 grader till 0 grader
{
myservo.write(POS); berätta servo gå för att placera i variabel "pos"
Delay(10); Waits 15 MS för servo att nå ställning
}*/
}
void servo2_return()
{
myservo2.attach(10);
int posact = myservo2.read();
om (myservo2.read() > 90) {
för (pos = posact; pos > 90; pos-= 1) / / tillbaka till 90
{/ / i steg om 1 grad
myservo2.write(POS); berätta servo gå för att placera i variabel "pos"
Delay(10); Waits 15 MS för servo att nå ställning
}
}
annat {
för (pos = posact; pos < = 90; pos + = 1) / / går från 0 grader till 180 grader
{/ / i steg om 1 grad
myservo2.write(POS); berätta servo gå för att placera i variabel "pos"
Delay(10); Waits 15 MS för servo att nå ställning
}
}
}
void servo1_no()
{
myservo.attach(9);
för (pos = 90; pos < 120; pos + = 1) / / går från 0 grader till 180 grader
{/ / i steg om 1 grad
myservo.write(POS); berätta servo gå för att placera i variabel "pos"
Delay(10); Waits 15 MS för servo att nå ställning
}
för (pos = 120; pos > = 90; pos-= 1) / / går från 180 grader till 0 grader
{
myservo.write(POS); berätta servo gå för att placera i variabel "pos"
Delay(10); Waits 15 MS för servo att nå ställning
}
}
void servo2()
{
myservo2.attach(10);
för (pos2 = 110, pos2 < 140, pos2 += 1) / / går från 0 grader till 180 grader
{/ / i steg om 1 grad
myservo2.write(POS2); berätta servo gå för att placera i variabel "pos"
Delay(15); Waits 15 MS för servo att nå ställning
}
}
void servo1R()
{
myservo.write(90);
myservo.detach();
}
void servo2R()
{
myservo2.write(90);
myservo2.detach();
}
void lampblink()
{
int sensorValue = digitalRead(6);
om (sensorValue = 1) {
digitalWrite(ledPin,HIGH);
fördröjning (1).
digitalWrite(ledPin,LOW);
fördröjning (1).
//}
annat
digitalWrite(ledPin,LOW);
}
void lamptest()
{
för (int jag = 0; jag < 100; i ++)
{
digitalWrite 12, hög.
Delay(50);
digitalWrite 12, låg.
Delay(50);
}
}
void lampoff()
{
fördröjning (2000);
digitalWrite (ledPin, låg);
}
Accelerometer
void Ecom()
{
unsigned char val [3].
int count = 0;
val [0] = val [1] = värde [2] = 64;
Wire.requestFrom(0x4c, 3); begära 3 byte från slav enheten 0x4c
While(Wire.available())
{
IF(Count < 3)
medan (val [antal] > 63) / / Ladda om den jävla saken det är dåligt
{
val [antal] = Wire.receive();
}
greve ++;
}
omforma 7 bitars signerat nummer in i en 8 bitars undertecknat nummer.
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); skriva ut läsning
Serial.Print ("y =");
Serial.println(ret.y,dec); skriva ut läsning
Serial.Print ("z =");
Serial.println(ret.z,dec); skriva ut behandlingen * /
}
char läsning = 0;
void loop()
{
Ecom(); kontroll av accelerometer staten
digitalWrite(ledPin2,HIGH);
buttonState = digitalRead(buttonPin); Läs statligt av växeln
om (buttonState == hög)
{
lampblink(); / / slå LED på:
myservo.attach(9); tillmäter objektet servo servo på pin 9
myservo2.attach(10); tillmäter objektet servo servo på pin 9
värde1 = ystate; läser värdet i potentiometern (värde mellan 0 och 1023)
värde1 = karta (värde1, 30, -30, 0, 179); skala den att använda den med servo (värde mellan 0 och 180)
myservo2.write(val1); anger servo skalad värde
värde2 = xstate; läser värdet i potentiometern (värde mellan 0 och 1023)
värde2 = karta (värde2, -30, 30, 0, 179); skala den att använda den med servo (värde mellan 0 och 180)
myservo.write(val2); anger servo skalad värde
om (ystate < -15) {
play_3();
}
}
annat {
kontroll av buller
int sensorValue2 = analogRead (A0); //noise sensor
Serial.println(sensorValue2);
IF(sensorValue2>thresholdvalue)
{
Serial.println("yes");
digitalWrite(ledNoise,HIGH);
play_4();
lampoff();
lampblink();
servo1_no();
servo1_no();
servo1R();
Delay(1000);
}
annat
{
lampoff();
}
kontroll för motion
int sensorValue = digitalRead(6); rörelsesensor
IF(sensorValue==1)
{
Serial.println("Move");
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);
}
annat
{
digitalWrite(ledNoise,LOW);
servo2();
servo1R();
servo2R();
lampoff();
play_2();
movestate = 0;
}
}
}