Arduino学习
首先到手的Arduino的UNO R3模块示意图如下
开发环境
arduino-1.7.8.org-windows
首先安装arduino-1.7.8.org-windows,默认安装就可以
安装中途会跳出驱动包,确认即可
安装好后打开后界面如下
名称 | 功能 |
---|---|
验证 | 编译程序 |
上传 | 将程序烧录到板子 |
新建 | 新建项目 |
打开 | 打开项目 |
保存 | 保存项目 |
工具设置中板:arduino uno
工具设置中端口:CH340对应的端口
驱动
安装CH341SER.EXE,默认安装就可以
代码方案
首先对于硬件的连接只需要,使用USB线将开发板与电脑连接即可
环境安装正确的情况下在设备管理工具中可以看到有对应串口
电阻识别,电阻通常分为四环电阻、五环电阻、六环电阻等,
其识别方法是,金色或者银色为最后一位
hello
项目代码
//===========================================================
// 例程1-Hello World!
//===============================================================
int val;//定义变量val
int ledpin=13;//定义数字接口13
void setup()
{
Serial.begin(9600);//设置波特率为9600,这里要跟软件设置相一致。当接入特定设备(如:蓝牙)时,我们也要跟其他设备的波特率达到一致。
pinMode(ledpin,OUTPUT);//设置数字13 口为输出接口,Arduino 上我们用到的I/O 口都要进行类似这样的定义。
}
void loop()
{
val=Serial.read();//读取PC 机发送给Arduino 的指令或字符,并将该指令或字符赋给val
if(val=='R')//判断接收到的指令或字符是否是“R”。
{//如果接收到的是“R”字符
digitalWrite(ledpin,HIGH);//点亮数字13 口LED。
delay(500);、、延时500ms
digitalWrite(ledpin,LOW);//熄灭数字13 口LED
delay(500);
Serial.println("Hello World!");//显示“Hello World!”字符串
}
}
为显示使用,拿出一个红色的led灯泡对应LED而言长的为正短的为负极
使用LED需要使用到限流电阻(220Ω左右,对于LED而言10mA电流就很大了,为了避免烧毁加上该电阻),面包板和接线
线路连接图,使用接线连接对应数字接口,按照电阻,LED,接地顺序连接。实物图如下
按顺序编译程序,并上传代码;
点开工具中的串口监视器,输入串口指令T,并发送可以看到灯泡点亮2秒后关闭,然后等待2秒后输出hello
LED点亮
硬件接线可以不变,使用上一个就可以,编译上传就可以
//============================智宇科技===========================
// 例程2-LED 闪烁
//===============================================================
int ledPin = 10; //定义数字10 接口
void setup()
{
//定义输入还是输出
pinMode(ledPin, OUTPUT);//定义小灯接口为输出接口
}
void loop()
{
//定义高电平还是低电平
digitalWrite(ledPin, HIGH); //点亮小灯
delay(1000); //延时1 秒,
digitalWrite(ledPin, LOW); //熄灭小灯
delay(1000); // 延时1 秒
}
模拟值AD采样
通过电位器,作为可调输入,将其数值转换为模拟值读取出来,接线示意图如下;这个程序只连接电位器,不连接LED部分,这个程序的的意思就是通过对电位器的VCC和GND接电,因为电位器可以通过旋转调节对应的电压值,并通过第三个引脚将该信号发送出去,其中arduino的A0到A5是可以进行模拟输入输出的,所以可以用来将电压值转换为模拟数值
硬件连接图
电位器有三个引脚,中间的单独的一个引脚对应A0,用于调节电阻大小,一个GND一个VCC
//============================智宇科技===========================
// 例程3-模拟值
//===============================================================
int potpin=0;//指定模拟端口A0
int ledpin=13;//指定LED端口 13
int val=0;//声明临时变量
void setup()
{
pinMode(ledpin,OUTPUT);//设置端口13为输出模式
Serial.begin(9600);//设置串口波特率为9600
}
void loop()
{
digitalWrite(ledpin,HIGH);//拉高端口13,LED点亮
delay(50);//延时0.05秒
digitalWrite(ledpin,LOW);//拉低端口13,关闭LED
delay(50);//延时0.05 秒
val=analogRead(potpin);//读取A0口的电压值并赋值到val
Serial.println(val);//串口发送val值
}
广告灯
接线示意图,这个程序就是多个LED顺序点亮没什么用
//============================智宇科技===========================
// 例程4-广告灯
//===============================================================
int BASE = 2 ; //第一颗 LED 接的 I/O 脚
int NUM = 6; //LED 的总数
int i=0;
void setup()
{
for (int i = BASE; i < BASE + NUM; i ++)
{
pinMode(i, OUTPUT); //设定数字I/O脚为输出
}
}
void loop()
{
for (i = BASE; i < BASE + NUM; i ++)
{
digitalWrite(i, LOW); //设定数字I/O脚出为"低",即顺序熄灭
delay(200); //延时
}
for (i = BASE; i < BASE + NUM; i ++)
{
digitalWrite(i, HIGH); //设定数字I/O脚输出为"低",即顺序点亮
delay(200); //延时
}
}
红路灯的实验类似的没必要再做
按键控制
使用按键实现电平的高低控制,按键按下的时候点亮,松开关闭
电路原理图
接线示意图,就是当开关按下去的时候,7就可以接收到一个高电平,7接收到高电平的时候,对应11就输出一个高电平,然后灯泡就会点亮,否则就是熄灭状态
抢答器
使用三个按键和三个LED进行实验,占用六个IO接口,程序一样只是多了几个硬件而已
//============================智宇科技===========================
// 例程7-抢答器
//===============================================================
int redled=10; //set IO 10 to red LED
int yellowled=9;//set IO 10 to yellow LED
int greenled=8;//set IO 10 to green LED
int redpin=7; //red key pin IO 7
int yellowpin=6;//yellow key pin IO 6
int greenpin=5;//green key pin IO 5
int red; //变量声明
int yellow;//变量声明
int green;//变量声明
void setup()
{
pinMode(redled,OUTPUT); //set as output
pinMode(yellowled,OUTPUT); //set as output
pinMode(greenled,OUTPUT); //set as output
pinMode(redpin,INPUT); //set as input
pinMode(yellowpin,INPUT); //set as input
pinMode(greenpin,INPUT); //set as input
}
void loop()
{
red=digitalRead(redpin);//读取按键状态
if(red==LOW) //按键状态为低
{ digitalWrite(redled,LOW);}//LED熄灭
else //按键状态为高
{ digitalWrite(redled,HIGH);}//LED点亮
yellow=digitalRead(yellowpin);
if(yellow==LOW)
{ digitalWrite(yellowled,LOW);}
else
{ digitalWrite(yellowled,HIGH);}
green=digitalRead(greenpin);
if(green==LOW)
{ digitalWrite(greenled,LOW);}
else
{ digitalWrite(greenled,HIGH);}
}
蜂鸣器
蜂鸣器和LED类似;只需要通电就可以使用,同时蜂鸣器工作电压为5V,因此直接连线烧录程序即可
//============================智宇科技===========================
// 例程8-蜂鸣器
//===============================================================
int buzzer=8;//设置控制蜂鸣器的数字IO脚
int i = 0;
void setup()
{
pinMode(buzzer,OUTPUT);//设置数字IO脚模式,OUTPUT为输出
}
void loop()
{
for(i=0;i<80;i++)//输出一个频率的声音
{
digitalWrite(buzzer,HIGH);//发声音
delay(1);//延时1ms
digitalWrite(buzzer,LOW);//不发声音
delay(1);//延时ms
}
for(i=0;i<100;i++)//输出另一个频率的声音
{
digitalWrite(buzzer,HIGH);//发声音
delay(2);//延时2ms
digitalWrite(buzzer,LOW);//不发声音
delay(2);//延时2ms
}
}
PWM灯光调节
PWM是脉冲宽度调制,电脑控制出现的电压只能是通电5V,断电0V,通过脉冲调制的占空比可以实现输出电压调制,多用于调节灯光、声音
脉冲宽度:高电平的持续时间
脉冲周期:1秒内的脉冲频率个数的倒数
电压高度:电压高度
对于arduino而言只有六个PWM接口,分别是3,5,6,9,10,11;
//============================智宇科技===========================
// 例程9-PWM调光
//===============================================================
int potpin=0;//定义模拟接口0
int ledpin=11;//定义数字接口11(PWM 输出)
int val=0;// 暂存来自传感器的变量数值
void setup()
{
pinMode(ledpin,OUTPUT);//定义数字接口11 为输出
Serial.begin(9600);//设置波特率为9600
//注意:模拟接口自动设置为输入
}
void loop()
{
val=analogRead(potpin);// 读取传感器的模拟值并赋值给val
Serial.println(val);//显示val 变量
analogWrite(ledpin,val/4);// 打开LED 并设置亮度(PWM 输出最大值255)
//delay(10);//延时10ms
//Serial.println(val);//显示“Hello World!”字符串
}
烧录程序后,结果可以实现对通过需按照电位器调节灯泡亮度
光敏电阻
使用光敏电阻控制蜂鸣器的声音大小的实验和普通的蜂鸣器实验差不多,只是将对应的电阻更换为光敏电阻而已,跳过
感热灯
和光敏电阻类似,就是温度高电阻大,温度低电阻小,通过不同的温度变化实现对灯泡的控制
88点阵
通过设定对应点电平高低实现对点的点亮,多个点组成一个显示数字
倾斜开关
倾斜开关就是内部有一个珠子,当倾斜的时候就会断开
火焰传感器
红外传感器对于火焰敏感,感受到火焰的时候电阻发生变化,对应加一个蜂鸣器就可以实现控制
数码管
数码管就是八个发光二极管,多共阳极或者共阴极,实验使用的共阴极。
电路图
使用的是38公用的阴极所以直接加载一个电阻就可以
对应代码
//============================智宇科技===========================
// 例程15-数码管
//===============================================================
//此处的对应关系是因为38公用为阴极,所以能用的剩下了八个,然后对应数码管的a管,对应连接的是ardUINO的第5个接口;这里数码管a对应的从下往上数的10个引脚中的第七个引脚
int a=7;//定义数字接口7 连接a 段数码管 数码管7脚
int b=6;// 定义数字接口6 连接b 段数码管 数码管6脚
int c=5;// 定义数字接口5 连接c 段数码管 数码管4脚
int d=11;// 定义数字接口11 连接d 段数码管 数码管2脚
int e=10;// 定义数字接口10 连接e 段数码管 数码管1脚
int f=8;// 定义数字接口8 连接f 段数码管 数码管9脚
int g=9;// 定义数字接口9 连接g 段数码管 数码管10脚
int dp=4;// 定义数字接口4 连接dp 段数码管 数码管5脚
void digital_1(void) //显示数字1
{
unsigned char j;
digitalWrite(c,HIGH);//点亮c段
digitalWrite(b,HIGH);//点亮b段
for(j=7;j<=11;j++)//7~11口相应段拉低:a,f,g,e,d
digitalWrite(j,LOW);
digitalWrite(dp,LOW);//小数点不点亮
}
void digital_2(void) //显示数字2
{
unsigned char j;
digitalWrite(b,HIGH);
digitalWrite(a,HIGH);
for(j=9;j<=11;j++)
digitalWrite(j,HIGH);
digitalWrite(dp,LOW);
digitalWrite(c,LOW);
digitalWrite(f,LOW);
}
void digital_3(void) //显示数字3
{
unsigned char j;
digitalWrite(g,HIGH);
digitalWrite(d,HIGH);
for(j=5;j<=7;j++)
digitalWrite(j,HIGH);
digitalWrite(dp,LOW);
digitalWrite(f,LOW);
digitalWrite(e,LOW);
}
void digital_4(void) //显示数字4
{
digitalWrite(c,HIGH);
digitalWrite(b,HIGH);
digitalWrite(f,HIGH);
digitalWrite(g,HIGH);
digitalWrite(dp,LOW);
digitalWrite(a,LOW);
digitalWrite(e,LOW);
digitalWrite(d,LOW);
}
void digital_5(void) //显示数字5
{
unsigned char j;
for(j=7;j<=9;j++)
digitalWrite(j,HIGH);
digitalWrite(c,HIGH);
digitalWrite(d,HIGH);
digitalWrite(dp,LOW);
digitalWrite(b,LOW);
digitalWrite(e,LOW);
}
void digital_6(void) //显示数字6
{
unsigned char j;
for(j=7;j<=11;j++)
digitalWrite(j,HIGH);
digitalWrite(c,HIGH);
digitalWrite(dp,LOW);
digitalWrite(b,LOW);
}
void digital_7(void) //显示数字7
{
unsigned char j;
for(j=5;j<=7;j++)
digitalWrite(j,HIGH);
digitalWrite(dp,LOW);
for(j=8;j<=11;j++)
digitalWrite(j,LOW);
}
void digital_8(void) //显示数字8
{
unsigned char j;
for(j=5;j<=11;j++)
digitalWrite(j,HIGH);
digitalWrite(dp,LOW);
}
void digital_9(void) //显示数字9
{
digitalWrite(a,HIGH);
digitalWrite(b,HIGH);
digitalWrite(c,HIGH);
digitalWrite(d,HIGH);
digitalWrite(e,LOW);
digitalWrite(f,HIGH);
digitalWrite(g,HIGH);
digitalWrite(dp,LOW);
}
void digital_a(void) //显示字母a
{
digitalWrite(a,HIGH);
digitalWrite(b,HIGH);
digitalWrite(c,HIGH);
digitalWrite(d,LOW);
digitalWrite(e,HIGH);
digitalWrite(f,HIGH);
digitalWrite(g,HIGH);
digitalWrite(dp,LOW);
}
void setup()
{
int i;//变量声明
for(i=4;i<=11;i++)
pinMode(i,OUTPUT);//设置4-11为输出口
}
void loop()
{
while(1)
{
digital_1();//显示数字1
delay(1000);//延时1s
digital_2();//显示数字2
delay(1000); //延时1s
digital_3();//显示数字3
delay(1000); //延时1s
digital_4();//显示数字4
delay(1000); //延时1s
digital_5();//显示数字5
delay(1000); //延时1s
digital_6();//显示数字6
delay(1000); //延时1s
digital_7();//显示数字7
delay(1000); //延时1s
digital_8();//显示数字8
delay(1000); //延时1s
digital_9();//显示数字9
delay(1000); //延时1s
digital_a();
delay(1000); //延时1s
}
}
四位数码管
类似于四个数码管拼接到一起
74HC595
实现级联输出,实现扩展功能
舵机控制
舵机控制用于将对应串口输入的值,转换为转换的角度,在通过PWM发生,等效延时来转到指定的角度。舵机就是根据输入转到相对应角度的操作
只需要将舵机和对应VCC、GND和信号口连接,接收到信号后进行反馈
舵机外部接线通常为:棕色为接地线,红色为电源正极线,橙色为信号线。
//============================智宇科技===========================
// 例程18-舵机控制
//===============================================================
//UART send 1~9==>20~180 degree
int servopin=9;//设置舵机驱动脚到数字口9
int myangle;//定义角度变量
int pulsewidth;//定义脉宽变量
int val;
void servopulse(int servopin,int myangle)/*定义一个脉冲函数,用来模拟方式产生PWM值*/
{
pulsewidth=(myangle*11)+500;//将角度转化为500-2480 的脉宽值
digitalWrite(servopin,HIGH);//将舵机接口电平置高
delayMicroseconds(pulsewidth);//延时脉宽值的微秒数
digitalWrite(servopin,LOW);//将舵机接口电平置低
delay(20-pulsewidth/1000);//延时周期内剩余时间
}
void setup()
{
pinMode(servopin,OUTPUT);//设定舵机接口为输出接口
Serial.begin(9600);//设置波特率为9600
Serial.println("servo=o_seral_simple ready" ) ;
}
void loop()
{
val=Serial.read();//读取串口收到的数据
if(val>'0'&&val<='9')//判断收到数据值是否符合范围
{
val=val-'0';//将ASCII码转换成数值,例'9'-'0'=0x39-0x30=9
val=val*(180/9);//将数字转化为角度,例9*(180/9)=180
Serial.print("moving servo to ");
Serial.print(val,DEC);
Serial.println();
for(int i=0;i<=50;i++) //产生PWM个数,等效延时以保证能转到响应角度
{
servopulse(servopin,val);//模拟产生PWM
}
}
}