|
本帖最后由 topdog 于 2018-4-3 21:50 编辑
左手定则和右手定则是在高中物理教材中电磁学部分出现的,是电磁学部分的重点之一。口诀“左通力右生电。” 还可以记忆为:因电而动用左手,因动而电用右手,方法简要:右手手指沿电流方向拳起,大拇指伸出,观察大拇指方向。
基于右手定律开发一个肺活量大比赛的竞技项目,用两个usb风扇按下图改装,用arduino测量电阻分压电压值。小伙伴吹动usb风扇的叶片带动电机里的线圈,移动于磁场的导体,因为动生电动势而产生的感应电流。电流通过二极管整流,电流穿过电阻产生电压,并联的电容消除高频波使测量稳定。arduino的模拟端口A0可以对微量的电压进行测量。
基于以上的原理改装两组usb风扇,看谁的累加值先到预设值,oled屏幕显示累加量判断胜负,比赛过程中启动炫彩led用亮度来激发气氛,比赛胜利者撞线后,泡泡机继电器接通,泡泡机开始喷射漂亮的肥皂泡泡,蜂鸣器奏乐,为比赛胜利者祝贺。
这是一个无厘头的,带有一定物理原理的游戏,让初中的学生们能够在玩中学习,激发思考,实现这个项目也需要了解arduino,外围洞洞板电路的焊接,风扇、泡泡机和hub板的连接,模拟I/O的使用,蜂鸣器的编曲,oled屏幕u8g库的使用,继电器的控制,炫彩led的操控渐变的实现,按键和系统时间的控制等,最后再用乐高积木做个控制台防止短路,并且把各个部件展现给参赛者。
参加比赛的学生们玩得多高兴呀。
材料如下:
coreUSB一个、HUB一个、继电器一个、蜂鸣器一个、炫彩led两个、开关一个、usb小风扇两个、泡泡机一个、乐高积木若干、导线、二极管、电阻、电容等
代码如下:
#include <Microduino_ColorLED.h> //引用美科科技彩灯库 语法手册 https://wiki.microduino.cn/index.php/Sensor-Color_LED_Reference
#include <U8glib.h>
#define setFont_M u8g.setFont(u8g_font_timB18) //OLED设置字体
#define RedPin A0 //设置红队风速检测引脚
#define BluePin A1 //设置蓝队风速检测引脚
#define PaoPin 12 //设置泡泡机控制引脚
#define KeyPin 10 //设置按键检测引脚
#define LedPin 8 //设置LED引脚
#define MidiPin 6 //设置蜂鸣器引脚
#define NUMPIXELS 2 //级联彩灯数量
ColorLED strip = ColorLED(NUMPIXELS, LedPin); //将ColorLED类命名为strip,并定义彩灯数量和彩灯引脚号
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE);
int SumRed = 0; //红队总分初始化
int SumBlue = 0; //蓝队总分初始化
int MaxSum = 1000; //游戏结束总分数设置
int MaxTime = 30; //游戏最大超时时间,单位:秒
//两只老虎跑得快曲谱
float tonelist[7]={1046.5,1174.7,1318.5,1396.9,1568,1760,1975.5};
long musiclist[32]={1,2,3,1,1,2,3,1,3,4,5,3,4,5,5,6,5,4,3,1,5,6,5,4,3,1,2,5,1,2,5,1};
long highlist[32]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,-1,0};
long rhythmlist[32]={4,4,4,4,4,4,4,4,4,4,2,4,4,2,8,8,8,8,4,4,8,8,8,8,4,4,4,4,2,4,4,2};
void playmusic() {
for (int i = 1; i <= 32; i = i + (1)) {
tone(MidiPin,tonelist[(int)(musiclist[(int)(i - 1)] - 1)] * pow(2, highlist[(int)(i - 1)]));
delay((2000 / rhythmlist[(int)(i - 1)]));
noTone(MidiPin);
delay(10);
}
}
void GameStart(void)
{
SumRed = 0; //红队总分初始化
SumBlue = 0; //蓝队总分初始化
int LED1 = 0;
int LED2 = 0;
long TimeCache = 0; //定义超时时间缓存
TimeCache = millis(); //获取系统运行时间
digitalWrite(PaoPin, LOW); //初始化关掉泡泡机
while((SumRed < MaxSum) && (SumBlue < MaxSum) && ((millis() - TimeCache) < MaxTime * 1000))
{
SumRed += analogRead(RedPin);
SumBlue += analogRead(BluePin);
u8g.firstPage();
do {
setFont_M;
u8g.setPrintPos(0, 20);
u8g.print("red");
setFont_M;
u8g.setPrintPos(60, 20);
u8g.print(SumRed);
setFont_M;
u8g.setPrintPos(0, 60);
u8g.print("blue");
setFont_M;
u8g.setPrintPos(60, 60);
u8g.print(SumBlue);
} while( u8g.nextPage() );
LED1 = map(SumRed, 0, MaxSum, 0, 255);
LED2 = map(SumBlue, 0, MaxSum, 0, 255);
if(SumRed >= MaxSum)LED1 = 255 ,LED2 = 0;
if(SumBlue >= MaxSum)LED2 = 255, LED1 =0;
strip.setPixelColor(0, strip.Color(LED1,0, 0)); //红队显示红色渐变灯效
strip.setPixelColor(1, strip.Color(0,0,LED2)); //蓝队显示蓝色渐变灯效
strip.show();
delay(50);
}
}
void setup()
{
Serial.begin(9600);
strip.begin(); //LED灯初始化
strip.setAllLED(COLOR_RED); //准备好了,两个红灯亮起。
strip.show();
pinMode(PaoPin, OUTPUT); //引脚初始化配置
pinMode(KeyPin, INPUT);
pinMode(MidiPin, OUTPUT);
digitalWrite(PaoPin, LOW); //初始化关掉泡泡机
digitalWrite(MidiPin, LOW); //初始化关掉蜂鸣器
}
void loop()
{
if(digitalRead(KeyPin) == LOW) //判断按键是否被按下
{
GameStart(); //开始游戏
if(SumRed >= MaxSum) //判断是否红队赢
{
digitalWrite(PaoPin, HIGH); //开泡泡机
u8g.firstPage(); //OLED显示红队胜利
do {
setFont_M;
u8g.setPrintPos(0, 20);
u8g.print("Red Win !!!");
} while( u8g.nextPage() );
playmusic(); //奏乐
}
else if(SumBlue >= MaxSum) //判断是否蓝队赢
{
digitalWrite(PaoPin, HIGH); //开泡泡机
u8g.firstPage(); //OLED显示蓝队胜利
do {
setFont_M;
u8g.setPrintPos(0, 20);
u8g.print("Blue Win !!!");
} while( u8g.nextPage() );
playmusic(); //奏乐
}
else
{
u8g.firstPage(); //红队蓝队都未则进行比赛则OLED显示游戏超时
do {
setFont_M;
u8g.setPrintPos(0, 20);
u8g.print("Time Out !!!");
} while( u8g.nextPage() );
}
delay(1000);
digitalWrite(PaoPin, LOW); //关掉泡泡机
digitalWrite(MidiPin, LOW); //关掉蜂鸣器
strip.setAllLED(COLOR_GREEN); //两个绿灯亮起,可以按下按键再来一次。
strip.show();
}
}
|
|