買麥當勞“開心樂園餐”送的機器貓玩偶:
155907iw93rls1di1rsd39.jpg (54.24 KB, 下載次數: 130)
下載附件
2016-4-11 02:53 上傳
15590627z71hwaai2hw7oa.jpg (57.26 KB, 下載次數: 122)
下載附件
2016-4-11 02:53 上傳
155908gx385mwm7mzklc87.jpg (41.4 KB, 下載次數: 137)
下載附件
2016-4-11 02:53 上傳
1559098gdmzf1vfddqwzvv.jpg (51.95 KB, 下載次數: 120)
下載附件
2016-4-11 02:53 上傳
所需材料:
155910c4skbr03n8v6g0v4.jpg (34.61 KB, 下載次數: 107)
下載附件
2016-4-11 02:53 上傳
- arduino nano
- U盤
- 手機震子
- 撥動小開關
- 雙色發光二極管
- 高亮草帽5mm白色發光二極管
- 壓電陶瓷片
- 光敏電阻
- 電阻:4.7K×1,220×2,1M×1,20×1
組裝:
155912x2oozhnxrhymmoor.jpg (46.61 KB, 下載次數: 118)
下載附件
2016-4-11 02:53 上傳
155911c0or9o9odo0rctw0.jpg (41.35 KB, 下載次數: 117)
下載附件
2016-4-11 02:53 上傳
- 改造U盤為合適尺寸并引出最外兩個供電正負極引腳
- U盤引出的供電引腳正極經撥動開關到nano的Vin腳,負極直接到nano的GND
- 手機震子接nano的GND并串20歐姆電阻到D7腳
- 雙色發光二極管是供陽極的,將220歐姆電阻串中間腳到nano +5V輸出,其余兩腳分別到D5和D6
- 高亮白色發光二極管接nano的GND并串220歐姆電阻到D9
- 壓電陶瓷片并1M歐姆電阻正極接nano的A1,負極接GND
- 光敏電阻接nano +5V和A0,4.7k歐姆電阻接A0和GND
- 揚聲器接nano D8腳和GND
代碼:
- // 8-ohm speaker on digital pin D8
- // shock moto on digital pin D7
- // big light on digital pin D9
- // led2 on degital pin D6
- // led1 on degital pin D5
- // photoresistor on analog A0 to 5V
- // 4.7K resistor on analog A0 to ground
- // + connection of the piezo attached to analog in A1
- // - connection of the piezo attached to ground
- // 1-megohm resistor attached from analog in A1 to ground
- //randompin A2
- #include "pitches.h"
- #include "notes.h"
- //output
- const int redLed = 5;
- const int greenLed = 6;
- const int motopin = 7;
- const int tonepin = 8;
- const int bigLed = 9;
- //input
- const int lightpin=A0;
- const int knockpin=A1;
- const int randpin=A2;
- int brightness = 0; // how bright the LED is
- int fadeAmount = 1; // how many points to fade the LED by
- int lightvalue;
- boolean isactive = true;
- //運行模式,0發聲,1震動
- int runmode = 0;
- const unsigned long sleeptime = 300000; //5 min
- long previousMillis = 0;
- unsigned long currentMillis = 0;
- const unsigned long mintev = 3600000; // 1 hour
- //錄制震動的數組
- boolean shockarray[30];
- void setup() {
- randomSeed(analogRead(randpin));
- shockarray[0]=true; //激活的震動被看作一次輸入
- pinMode(bigLed, OUTPUT);
- pinMode(redLed, OUTPUT);
- pinMode(greenLed, OUTPUT);
- pinMode(motopin, OUTPUT);
- resetled();
- setmodeled(runmode); //設置狀態燈顯示
- lightvalue=analogRead(lightpin);
- playmusic(notesstart,Durationsstart,sizeof(notesstart)/sizeof(notesstart[0]),1);
- }
- void loop() {
- //計算時間
- tick();
- //判斷是否處于活動狀態
- if(isactive) { //激活狀態
- //遮擋 改變運行模式
- if(checkcover()) {
- runmode = runmode +1;
- if(runmode> 1) {
- runmode = 0;
- }
- //設置模式的led
- resetled();
- setmodeled(runmode); //設置狀態燈顯示
- resettick();
- }else{
- //震動 換歌 和 震動輸入
- if(checkknock()) {
- if(runmode == 0) { //換歌
- randomplay();
- setmodeled(runmode); //恢復狀態燈顯示
- }else if(runmode == 1) { //震動輸入
- recordandplayshock();
- }
- resettick();
- }else{
- //goto sleep
- if(checktime(sleeptime)) {
- isactive = false;
- resetled();
- resettick();
- }
- }
- }
- }else{ //休眠狀態
- if(checkActive()) {
- isactive=true;
- resetled();
- setmodeled(runmode); //恢復狀態燈顯示
- resettick();
- }else{
- //呼吸燈
- fade(bigLed,100,20);
- //運行休眠1小時的事件 報時
- if(checktime(mintev)) {
- playmusic(notesalarm,Durationalarm,sizeof(notesalarm)/sizeof(notesalarm[0]),1);
- }
- }
- }
-
- //fade(bigLed,100,30);
- //flash(bigLed,50);
- //shockme(motopin,500,500);
- // if(checkknock()) {
- // flash(bigLed,50);
- // }
- // if(checkcover()) {
- // flash(bigLed,50);
- // }
- //Blink(redLed,500,500);
- //Blink(greenLed,500,500);
- }
- //錄制和播放震動
- void recordandplayshock() {
- //進行錄制 帶閃光
- int arraylen=sizeof(shockarray)/sizeof(shockarray[0]);
- flash(bigLed,100);
- for(int i=1;i < arraylen;i++) {
- shockarray[i]=checkknock();
- if(shockarray[i]) {
- flash(bigLed,100);
- }else{
- delay(50);
- }
- }
- //播放
- for(int i=0;i < arraylen;i++) {
- if(shockarray[i]) {
- shockme(motopin,100,50);
- }else{
- delay(50);
- }
- }
- }
- //隨機播放
- void randomplay() {
- long randNumber = random(10); //0-9
- switch (randNumber) {
- case 0:
- playmusic(notesstart,Durationsstart,sizeof(notesstart)/sizeof(notesstart[0]),1);
- break;
- case 1:
- playmusic(notesalarm,Durationalarm,sizeof(notesalarm)/sizeof(notesalarm[0]),1);
- break;
- case 2:
- playmusic(notesnokia,Durationsnokia,sizeof(notesnokia)/sizeof(notesnokia[0]),1);
- break;
- case 3:
- playmusic(notescat,Durationscat,sizeof(notescat)/sizeof(notescat[0]),1);
- break;
- case 4:
- playmusic(notemario,Durationsmario,sizeof(notemario)/sizeof(notemario[0]),1);
- break;
- case 5:
- playmusic(noteMission,DurationsMission,sizeof(noteMission)/sizeof(noteMission[0]),1);
- break;
- case 6:
- doflash(4);
- break;
- case 7:
- doblink(4);
- break;
- case 8:
- doshock(4);
- break;
- default:
- playmusic(notesstart,Durationsstart,sizeof(notesstart)/sizeof(notesstart[0]),1);
- }
- }
- //設置運行模式狀態led 無自動熄滅
- void setmodeled(int mode) {
- int pin = redLed;
- if(mode==1)
- {
- pin = greenLed;
- }
- digitalWrite(pin,LOW); // set the LED on
- }
- //重置所有led
- void resetled() {
- digitalWrite(bigLed, LOW);
- digitalWrite(redLed, HIGH); // set the LED off
- digitalWrite(greenLed, HIGH); // set the LED off
- }
- //播放音符
- void playmusic(int melody[],int noteDurations[],int notelengh,float notespeed) {
- for (int thisNote = 0; thisNote < notelengh ; thisNote++) {
- // to calculate the note duration, take one second
- // divided by the note type.
- //e.g. quarter note = 1000 / 4, eighth note = 1000/8, etc.
- int noteDuration = 1000/noteDurations[thisNote];
- tone(tonepin, melody[thisNote],noteDuration);
- // to distinguish the notes, set a minimum time between them.
- // the note's duration + 30% seems to work well:
- int pauseBetweenNotes = noteDuration * notespeed;
- delay(pauseBetweenNotes);
- // stop the tone playing:
- noTone(tonepin);
- }
- }
- void doshock(int count) {
- int idx=0;
- while(idx<count) {
- shockme(motopin,1000,500);
- idx=idx+1;
- }
- }
- void doflash(int count) {
- int idx=0;
- while(idx<count) {
- flash(bigLed,50);
- delay(50);
- idx=idx+1;
- }
- }
- void doblink(int count) {
- int idx=0;
- int temp = runmode;
- resetled();
- while(idx<count) {
- temp =temp+1;
- if(temp > 1) {
- temp=0;
- }
- int pin = redLed;
- if(temp==1) {
- pin = greenLed;
- }
- Blink(pin,100,100);
- idx=idx+1;
- }
- }
- //呼吸燈 無自動熄滅
- void fade(int pin,int maxl,int time) {
- analogWrite(pin, brightness);
- // change the brightness for next time through the loop:
- brightness = brightness + fadeAmount;
- // reverse the direction of the fading at the ends of the fade:
- if (brightness <= 0 || brightness >= maxl) {
- fadeAmount = -fadeAmount ;
- }
- delay(time);
- }
- //閃爍
- void Blink(int pin,int ontime,int offtime) {
- digitalWrite(pin,LOW); // set the LED on
- delay(ontime);
- digitalWrite(pin, HIGH); // set the LED off
- delay(offtime);
- }
- //閃光
- void flash(int pin,int time) {
- digitalWrite(pin, LOW);
- digitalWrite(pin, HIGH);
- delay(time);
- digitalWrite(pin, LOW);
- }
- //震動
- void shockme(int pin,int ontime,int offtime) {
- digitalWrite(pin,HIGH);
- delay(ontime);
- digitalWrite(pin, LOW);
- delay(offtime);
- }
- //檢測震動
- boolean checkknock() {
- boolean isknocked = false;
- int sensorReading = analogRead(knockpin);
- if (sensorReading >= 2) {
- isknocked=true;
- }
- return isknocked;
- }
- //檢測光線遮擋
- boolean checkcover() {
- boolean iscovered = false;
- int temp=analogRead(lightpin);
- if((lightvalue - temp) >= 50) {
- iscovered = true;
- }
- lightvalue = temp;
- delay(50);
- return iscovered;
- }
- //檢測光線遮擋快速
- boolean checkcoverfast() {
- boolean iscovered = false;
- int temp=analogRead(lightpin);
- if((lightvalue - temp) >= 50) {
- iscovered = true;
- }
- lightvalue = temp;
- return iscovered;
- }
- //檢測激活
- boolean checkActive() {
- boolean isActive =false;
- isActive = checkcoverfast();
- if(!isActive)
- {
- isActive = checkknock();
- }
- return isActive;
- }
- //計數器計時
- void tick() {
- currentMillis = millis();
- //計時器溢出自動復位的處理
- if(currentMillis < previousMillis) {
- unsigned long partMillis = 4294967295 - previousMillis + 1;
- previousMillis =-partMillis + 1;
- }
- }
- //同時只允許使用一個計數器
- boolean checktime(unsigned long time) {
- boolean istimeup =false;
- if(currentMillis - previousMillis >= time) {
- istimeup = true;
- resettick();
- }
- return istimeup;
- }
- //重置計數器
- void resettick() {
- previousMillis=currentMillis;
- }
復制代碼
項目引用的文件:
pitches.h
- /*************************************************
- * Public Constants
- *************************************************/
- #define NOTE_B0 31
- #define NOTE_C1 33
- #define NOTE_CS1 35
- #define NOTE_D1 37
- #define NOTE_DS1 39
- #define NOTE_E1 41
- #define NOTE_F1 44
- #define NOTE_FS1 46
- #define NOTE_G1 49
- #define NOTE_GS1 52
- #define NOTE_A1 55
- #define NOTE_AS1 58
- #define NOTE_B1 62
- #define NOTE_C2 65
- #define NOTE_CS2 69
- #define NOTE_D2 73
- #define NOTE_DS2 78
- #define NOTE_E2 82
- #define NOTE_F2 87
- #define NOTE_FS2 93
- #define NOTE_G2 98
- #define NOTE_GS2 104
- #define NOTE_A2 110
- #define NOTE_AS2 117
- #define NOTE_B2 123
- #define NOTE_C3 131
- #define NOTE_CS3 139
- #define NOTE_D3 147
- #define NOTE_DS3 156
- #define NOTE_E3 165
- #define NOTE_F3 175
- #define NOTE_FS3 185
- #define NOTE_G3 196
- #define NOTE_GS3 208
- #define NOTE_A3 220
- #define NOTE_AS3 233
- #define NOTE_B3 247
- #define NOTE_C4 262
- #define NOTE_CS4 277
- #define NOTE_D4 294
- #define NOTE_DS4 311
- #define NOTE_E4 330
- #define NOTE_F4 349
- #define NOTE_FS4 370
- #define NOTE_G4 392
- #define NOTE_GS4 415
- #define NOTE_A4 440
- #define NOTE_AS4 466
- #define NOTE_B4 494
- #define NOTE_C5 523
- #define NOTE_CS5 554
- #define NOTE_D5 587
- #define NOTE_DS5 622
- #define NOTE_E5 659
- #define NOTE_F5 698
- #define NOTE_FS5 740
- #define NOTE_G5 784
- #define NOTE_GS5 831
- #define NOTE_A5 880
- #define NOTE_AS5 932
- #define NOTE_B5 988
- #define NOTE_C6 1047
- #define NOTE_CS6 1109
- #define NOTE_D6 1175
- #define NOTE_DS6 1245
- #define NOTE_E6 1319
- #define NOTE_F6 1397
- #define NOTE_FS6 1480
- #define NOTE_G6 1568
- #define NOTE_GS6 1661
- #define NOTE_A6 1760
- #define NOTE_AS6 1865
- #define NOTE_B6 1976
- #define NOTE_C7 2093
- #define NOTE_CS7 2217
- #define NOTE_D7 2349
- #define NOTE_DS7 2489
- #define NOTE_E7 2637
- #define NOTE_F7 2794
- #define NOTE_FS7 2960
- #define NOTE_G7 3136
- #define NOTE_GS7 3322
- #define NOTE_A7 3520
- #define NOTE_AS7 3729
- #define NOTE_B7 3951
- #define NOTE_C8 4186
- #define NOTE_CS8 4435
- #define NOTE_D8 4699
- #define NOTE_DS8 4978
復制代碼
notes.h
- //beep tone
- // notes in the melody:
- int notesalarm[] = {
- NOTE_C4, NOTE_G3,NOTE_G3, NOTE_A3, NOTE_G3,0, NOTE_B3, NOTE_C4};
- // note durations: 4 = quarter note, 8 = eighth note, etc.:
- int Durationalarm[] = {
- 4,8,8,4,4,4,4,4 };
-
- //start tone
- int notesstart[] = {
- NOTE_C5, NOTE_G5,NOTE_E5, NOTE_G5};
- int Durationsstart[] = {
- 8, 8, 8,4 };
-
- //nokia tone
- int notesnokia[] = {
- NOTE_G5, NOTE_F5, NOTE_A4, NOTE_B4,
- NOTE_E5, NOTE_D5, NOTE_F4, NOTE_G4,
- NOTE_D5, NOTE_C5, NOTE_E4, NOTE_G4,
- NOTE_C5 };
- int Durationsnokia[] = {
- 8, 8, 4, 4,
- 8, 8, 4, 4,
- 8, 8, 4, 4,
- 2};
-
- //machinecat
- int notescat[] = {
- NOTE_G4, NOTE_A4, NOTE_C5, NOTE_E5,NOTE_A5,NOTE_E5,NOTE_G5,0,
- NOTE_G5, NOTE_A5, NOTE_G5, NOTE_E5,NOTE_F5, NOTE_E5,NOTE_D5,0,
- NOTE_A4,NOTE_D5, NOTE_D5,NOTE_F5, NOTE_B5, NOTE_B5, NOTE_A5, NOTE_G5,
- NOTE_F5,NOTE_F5,NOTE_E5,NOTE_A4,NOTE_B4,NOTE_C5,
- NOTE_D5,
- NOTE_A5,NOTE_A5,NOTE_G5,NOTE_F5,NOTE_G5,NOTE_A5,NOTE_G5,
- NOTE_D5,NOTE_E5,NOTE_FS5,NOTE_D5,NOTE_G5,0,
- NOTE_A5,0,NOTE_G5,0,NOTE_F5,0,0,
- NOTE_D5,NOTE_B5,NOTE_A5,NOTE_G5,NOTE_A5,NOTE_G5,NOTE_F5,
- 0,NOTE_G5,NOTE_A5,NOTE_E5,NOTE_D5,
- NOTE_C5
- };
- int Durationscat[] = {
- 4, 8, 4, 8, 4, 8,3,32,
- 4, 8, 4, 8, 4, 8,3,16,
- 4, 8, 4, 8, 4, 8,4,8,
- 3, 3, 8, 3, 3, 8,
- 1,
- 3, 4, 8, 8, 8, 8,3,
- 4, 8, 4, 8, 2, 8,
- 4, 8, 4, 8, 4, 8, 4,
- 3, 4, 8, 4, 8, 4, 4,
- 4, 4, 8, 2, 8,
- 1
- };
-
- //Mario
- int notemario[] = {NOTE_E4, NOTE_E4, NOTE_E4, NOTE_C4, NOTE_E4, NOTE_G4, NOTE_G3,NOTE_C4,
- NOTE_G3, NOTE_E3, NOTE_A3, NOTE_B3, NOTE_AS3, NOTE_A3, NOTE_G3, NOTE_E4, NOTE_G4, NOTE_A4,
- NOTE_F4, NOTE_G4, NOTE_E4, NOTE_C4, NOTE_D4, NOTE_B3,NOTE_C4, NOTE_G3, NOTE_E3, NOTE_A3,
- NOTE_B3, NOTE_AS3, NOTE_A3, NOTE_G3, NOTE_E4, NOTE_G4, NOTE_A4, NOTE_F4, NOTE_G4, NOTE_E4,
- NOTE_C4, NOTE_D4, NOTE_B3,NOTE_G4, NOTE_FS4, NOTE_E4, NOTE_DS4, NOTE_E4, NOTE_GS3, NOTE_A3,
- NOTE_C4, NOTE_A3, NOTE_C4, NOTE_D4, NOTE_G4, NOTE_FS4, NOTE_E4, NOTE_DS4, NOTE_E4, NOTE_C5,
- NOTE_C5, NOTE_C5,NOTE_G4, NOTE_FS4, NOTE_E4, NOTE_DS4, NOTE_E4, NOTE_GS3, NOTE_A3, NOTE_C4,
- NOTE_A3, NOTE_C4, NOTE_D4, NOTE_DS4, NOTE_D4,NOTE_C4};
- int Durationsmario[] = {8,4,4,8,4,2,2,3,
- 3,3,4,4,8,4,8,8,8,4,
- 8,4,3,8,8,3,3,3,3,4,
- 4,8,4,8,8,8,4,8,4,3,
- 8,8,2,8,8,8,4,4,8,8,
- 4,8,8,3,8,8,8,4,4,4,
- 8,2,8,8,8,4,4,8,8,4,
- 8,8,3,3,3,2};
-
- //Mission Impossible
- int noteMission[] = {NOTE_D5,NOTE_DS5, NOTE_D5,NOTE_DS5,NOTE_D5,NOTE_DS5,NOTE_D5,
- NOTE_DS5,NOTE_D5,NOTE_DS5,NOTE_D5,NOTE_DS5,NOTE_D5,NOTE_DS5,NOTE_D5,
- NOTE_DS5,NOTE_D5,NOTE_DS5,NOTE_D5,NOTE_DS5,NOTE_D5,NOTE_DS5,NOTE_D5,
- NOTE_DS5,NOTE_D5,NOTE_DS5,NOTE_D5,NOTE_DS5,NOTE_D5,NOTE_DS5,NOTE_D5,
- NOTE_DS5,NOTE_D5,NOTE_DS5,NOTE_D5,NOTE_DS5,NOTE_DS5,NOTE_E5,NOTE_F5,
- NOTE_G5,
- NOTE_E2,0,0,NOTE_E2,0,NOTE_E2,NOTE_G2,0,NOTE_A2,0,
- NOTE_E2,0,0,NOTE_E2,0,NOTE_E2,NOTE_D2,0,NOTE_DS2,0,
- NOTE_AS4,NOTE_G4,NOTE_D4,NOTE_D4,NOTE_AS4,NOTE_G4,NOTE_CS4,NOTE_CS4,NOTE_AS4,NOTE_G4,NOTE_C4,NOTE_C4,NOTE_B3,NOTE_C4,0,
- NOTE_B3,NOTE_G3,NOTE_FS4,NOTE_FS4,NOTE_B3,NOTE_G3,NOTE_F4,NOTE_F4,NOTE_B3,NOTE_G3,NOTE_E4,NOTE_E4,NOTE_DS4,NOTE_D4
-
- };
- int DurationsMission[] = {8,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,
- 16,16,16,16,16,16,16,16,
- 8,
- 6,6,6,6,6,6,6,6,6,6,
- 6,6,6,6,6,6,6,6,6,6,
- 6,6,2,1,6,6,2,1,6,6,2,1,6,6,1,
- 6,6,2,1,6,6,2,1,6,6,2,1,6,6
- };
復制代碼
完成:
155913padiqdsh7mg9vud7.jpg (47.43 KB, 下載次數: 128)
下載附件
2016-4-11 02:53 上傳
155914bsswykfbfpp6y1bb.jpg (44.56 KB, 下載次數: 133)
下載附件
2016-4-11 02:53 上傳
注意事項:
- 壓電陶瓷片盡量選用靈敏的、分貝高的,否則就不能感應聲音只能感應震動了
- 揚聲器是原玩偶自帶的16歐姆0.25W,建議串100歐姆電阻
- 從U盤引出電源時注意造成短路
|