小猪学arduino—使用L298N控制两个直流电机

简介

L298N驱动模块,可以驱动2个直流电机,可分别实现正转,反转功能.

准备材料

Arduino Uno       * 1
L298N驱动模块   * 1
直流电机               * 2
18650电池            * 2
跳线                      若干

连线方法

注意:L298N必须外接6-12v电压及一定电流的外接电池,在这里被坑了好久,用普通的6v+电池外接时,不是只转一个轮子就是在拔掉电脑数据线后完全不转了,最后把外接电源换成两节18650电池后解决

程序代码

选用IO口为5,6,9,10,这四个均支持PWM,可以通过占空比代码实现控制转动速度的快慢

//LingShun Lab int input1 = 5; // 定义uno的pin 5 向 input1 输出 int input2 = 6; // 定义uno的pin 6 向 input2 输出 int input3 = 9; // 定义uno的pin 9 向 input3 输出 int input4 = 10; // 定义uno的pin 10 向 input4 输出 void setup() { // Serial.begin (9600); //初始化各IO,模式为OUTPUT 输出模式

阅读全文

小猪学arduino—使用DS3231芯片测量温度

上一篇,我们尝试了 DS3231高精度时钟模块的使用 ,今天我们试一下这个芯片集成的数字温度传感器(传感器每64秒采集一次,精度为±3℃)。

看了下uRTCLib库没有温度相关的函数,但实际芯片上是有温度测量模块的,跟时钟一样通过串口通信,为了省事就直接在uRTCLib库上进行改造,以使它支持温度的获取。通过arduino官方开发工具库添加的库默认位置在

/Users/yanjingang/Documents/Arduino/libraries/目录下。

一、uRTCLib添加温度获取功能

vim uRTCLib/src/uRTCLib.h  #添加温度变量和函数声明

class uRTCLib {
	private:
		uint8_t _temperature = 0;
	public:
		uint8_t temperature();
}

vim uRTCLib/src/uRTCLib.cpp  #实际温度获取

void uRTCLib::refresh() { //给串口发送指令,获取温度信息 byte temp; Wire.beginTransmission(URTCLIB_ADDRESS); Wire.write(uint8_t(0x11)); Wire.endTransmission(); Wire.requestFrom(URTCLIB_ADDRESS, 2); temp = Wire.read(); // Here's the MSB _temperature

阅读全文

小猪学arduino—DS3231高精度时钟模块的使用

ds3231

arduino是个功能很弱的单片机,自身没有获得当前时间的功能。仅有的mills()记录系统运行时长函数在49天左右后也会溢出而重置,无法用于时钟,故只能外加一个时钟芯片。

网上搜到的常用芯片一般是ds1307,比小指甲盖还小,成本只有几毛钱,很划算。因为后续我还有存储信息的需求,所以最终选择了集成DS3231 AT24C32 高精度时钟模块 IIC模块 存储模块功能的芯片,大概2/3大拇指那么大,某宝上一堆。

ds3231时钟模块参数如下:

DS3231是低成本、高精度I2C实时时钟(RTC),具有集成的温补晶振(TCXO)和晶体。包含扭扣电池,断开主电源时仍可保持精确的计时

RTC保存秒、分、时、星期、日期、月和年信息。少于31天的月份,将自动调整月末的日期,包括闰年的修正。时钟的工作格式可以是24小时或带/AM/PM指示的12小时格式。提供两个可设置的日历闹钟和一个可设置的方波输出。地址与数据通过I2C双向总线串行传输。
精密的、经过温度补偿的电压基准和比较器电路用来监视VCC状态,检测电源故障,提供复位输出,并在必要时自动切换到备份电源。另外,/RST监视引脚可以作为产生μP复位的手动输入。
除计时精度高之外,DS3231还具有一些其它功能,这些功能扩展了系统主机的附加功能和选择范围。该器件内部集成了一个非常精确的数字温度传感器,可通过I2C*接口对其进行访问(如同时间一样)。这个温度传感器的精度为±3°C。片上控制电路可实现自动电源检测,并管理主电源和备用电源(即低压电池) 之间的电源切换。如果主电源掉电,该器件仍可继续提供精确的计时和温度,性能不受影响。当主电源重新加电或电压值返回到容许范围内时,片上复位功能可用来重新启动系统微处理器。

模块参数:
1.尺寸:38mm(长)*22mm(宽)*14mm(高)
2.重量:8g
3.工作电压:3.3–5.5V
4.时钟芯片:高精度时钟芯片DS3231
5.时钟精度:0-40℃范围内,精度2ppm,年误差约1分钟
6.带2个日历闹钟
7.可编程方波输出
8.实时时钟产生秒、分、时、星期、日期、月和年计时,并提供有效期到2100年的闰年补偿
9.芯片内部自带温度传感器,精度为±3℃
10.存储芯片:AT24C32(存储容量32K)
11.IIC总线接口,最高传输速度400KHz(工作电压为5V时)
12.可级联其它IIC设备,24C32地址可通过短路A0/A1/A2修改,默认地址为0x57
13.带电池CR2032,保证系统断电后,时钟任然正常走动
14.包装方式:单个防静电包装
一、接线说明(以Arduino uno r3为例):
SCL→A5
SDA→A4
VCC→5V
GND→GND

二、安装uRTCLib库(找来找去,还是这个库好用,似乎是针对这快集成芯片封装的)

三、使用uRTCLib库测试初始化和读取ds3231的时间

#include <uRTCLib.h> #include "Arduino.h" #include "Wire.h" #include "uRTCLib.h" uRTCLib rtc; unsigned int pos; void setup() { delay (2000); Serial.begin(9600); Serial.println("Serial OK"); // Max position: 32767 for (pos = 0; pos < 1000; pos++) { rtc.eeprom_write(pos, (unsigned char) pos % 256); } //芯片初次使用时初始化一次当前时间,成功后注掉这行 //rtc.set(0

阅读全文

小猪学arduino—1602LCD液晶显示屏

%e6%9c%aa%e5%91%bd%e5%90%8d

本次实验使用arduino直接驱动1602液晶显示字母。
1602液晶在应用中非常广泛,最初的1602液晶使用的是HD44780控制器,现在各个厂家的1602模块基本上都是采用了与之兼容的IC,所以特性上基本都是一致的。

1602LCD主要技术参数
显示容量为16×2个字符;
芯片工作电压为4.5~5.5V;
工作电流为2.0mA(5.0V);
模块最佳工作电压为5.0V;
字符尺寸为2.95×4.35(W×H)mm。

1602采用标准的16脚接口,其中:
第1脚:VSS为地电源
第2脚:VDD接5V正电源
第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度
第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读信号,当RS为高电平RW为低电平时可以写入数据。
第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
第7~14脚:D0~D7为8位双向数据线。
第15脚:背光电源正极
第16脚:背光电源负极

1602直接与arduino通信,根据产品手册描述,分8位连接法与4位连接法,本实验使用8位连接法。硬件连接方式如下图好电路后,就可以开始编写程序了。
8位连接法:

4位连接法:

8位与4位连接法除初始化时不同,其它是一样的。

在Arduino的安装目录下\libraries\LiquidCrystal可以查看到函数的原型
LiquidCrystal()——定义你的LCD的接口:各个引脚连接的I/O口编号,格式为LiquidCrystal(rs, enable, d4, d5, d6, d7)
LiquidCrystal(rs, rw, enable, d4, d5, d6, d7)
LiquidCrystal(rs, enable, d0, d1, d2, d3, d4, d5, d6, d7)
LiquidCrystal(rs, rw, enable, d0, d1, d2, d3, d4, d5, d6, d7)
begin()——定义LCD的长宽(n列×n行),格式lcd.begin(cols, rows)
clear()——清空LCD,格式lcd.clear()
home()——把光标移回左上角,即从头开始输出,格式lcd.home()
setCursor()——移动光标到特定位置,格式lcd.setCursor(col, row)
write()——在屏幕上显示内容(必须是一个变量,如”Serial.read()”),格式lcd.write(data)
print()——在屏幕上显示内容(字母、字符串,等等),格式lcd.print(data)
lcd.print(data, BASE)
cursor()——显示光标(一条下划线),格式lcd.cursor()
noCursor()——隐藏光标,格式lcd.noCursor()
blink()——闪烁光标,格式lcd.blink()
noBlink()——光标停止闪烁,格式lcd.noBlink()
display()——(在使用noDisplay()函数关闭显示后)打开显示(并恢复原来内容),格式lcd.display()
noDisplay()——关闭显示,但不会丢失原来显示的内容,格式为lcd.noDisplay()
scrollDisplayLeft()——把显示的内容向左滚动一格,格式lcd.scrollDisplayLeft()
scrollDisplayRight()——把显示的内容向右滚动一格,格式为lcd.scrollDisplayRight()
autoscroll()——打开自动滚动,这使每个新的字符出现后,原有的字符都移动一格:如果字符一开始从左到右(默认),那么就往左移动一格,否则就向右移动,格式lcd.autoscroll()
noAutoscroll()——关闭自动滚动,格式lcd.noAutoscroll()
leftToRight()——从左往右显示,也就是说显示的字符会从左往右排列(默认),但屏幕上已经有的字符不受影响,格式lcd.leftToRight()
rightToLeft()——从右往左显示,格式lcd.rightToLeft()
createChar()——自造字符,最多5×8像素,编号0-7,字符的每个像素显示与否由数组里的数(0-不显示,1-显示)决定,格式lcd.createChar(num, data)
参考源程序如下:

#include <LiquidCrystal.h> //申明1602液晶的函数库 //申明1602液晶的引脚所连接的Arduino数字端口,8线或4线数据模式,任选其一 LiquidCrystal lcd(12,11,10,9,8,7,6,5,4,3,2); //8数据口模式连线声明 //LiquidCrystal lcd(12,11,10,5,4,3,2); //4数据口模式连线声明 int i; void setup(){ lcd.begin(16,2)

阅读全文

小猪学arduino—机械6足虫的制作

111

上一篇,我们为6足虫的制作提前准备研究了下 舵机的使用 ,这次,我们开始动手,实现我们的机械6脚虫虫。

准备的材料如下:

3个舵机(用于控制虫子的6条腿)、1个有一定硬度的铁丝(我用的铁质衣撑,用于制作6条腿)、1个核桃露瓶子(用于做虫身)、1个红外线发射和接收器(用于遥控)、1个led灯(用于遥控按下提示灯)、1个220的电阻、1块arduino uno板子及若干连接线。

思路:

由于上一篇 舵机的使用 已经为虫虫的制做做的准备,所以不再赘述,这次相当于在上一次的基础上,改进控制代码,增加遥控器c键初始化虫子脚;play键让虫子向前爬5步。

为了搞清楚虫子的腿应该怎么爬,我跟儿子一起趴床上假装老虎爬了一会儿,得出一个4腿动物的移动方法:左前腿->右后腿->右前腿->左后腿。

按这个思路实现了控制腿的代码逻辑后,用硬纸把舵机粘一起反复测试调角度参数,让它能向前爬动。测试发现4条腿遇到障碍物时容易侧翻,所以又在中间加了两条腿,变成的6脚虫。

之后儿子又提出能不能让虫子自己去外边爬,就一起顺便给虫子用核桃露瓶做了个外壳,把舵机用强力胶粘上去固定好(因为要背电池和板子,比较重),然后用两节18650 锂离子电池串联起来代替电脑usb供电(正极接到VIN端口、负极接到GND端口),再让虫子自己背着电路板和电池。由于负重后压力太大,舵机和腿掉了好几次,后来干脆把腿用502粘到舵机齿轮上了,再根据爬行情况调一下腿和角度参数,反复测试后终于成功,儿子很开心,还用他的超轻彩泥给虫子做了几个脚,哈哈。

v1.0硬纸版效果:

v1.1独自负重版:

(4个腿和6个腿在平地上爬行效果差不多,区别在一侧遇到障碍物时,6脚不容易侧翻)

代码如下:

#include <IRremote.h>//包含红外库 int infraredPin = 3;//红外线接收器端口 long INFRARED_PLAY = 0x00FFA857;//红外遥控器上的PLAY键指令 long INFRARED_LEFT = 0x00FFE01F;//红外遥控器上的左键指令 long INFRARED_RIGHT = 0x00FF906F;//红外遥控器上的右键指令 long INFRARED_UP = 0x00FF02FD;//红外遥控器上的上键指令 long

阅读全文

小猪学arduino—舵机的使用

%e8%88%b5%e6%9c%ba

上一篇文章我们讲到了使用红外线发射和接收装置控制led,儿子看后表示能不能做个遥控器控制一个小虫子走路,研究了一下,打算用两个舵机实现,每个舵机负责虫子的两只脚。本文先用学习一下舵机的使用,并用两个舵机测试一下这种想法的可行性。为了降低测试成本,在某宝5块多的价格买了几个9g的微型舵机。

舵机有很多规格,但所有的舵机都有外接三根线,分别用棕、红、橙三种颜色进行区分,由于舵机品牌不同,颜色也会有所差异,棕色为接地线,红色为电源正极线,橙色为信号线。

舵机的转动的角度是通过调节PWM(脉冲宽度调制)信号的占空比来实现的,标准PWM(脉冲宽度调制)信号的周期固定为20ms50Hz),理论上脉宽分布应在1ms2ms 之间,但是,事实上脉宽可由0.5ms 2.5ms 之间,脉宽和舵机的转角180°相对应。有一点值得注意的地方,由于舵机牌子不同,对于同一信号,不同牌子的舵机旋转的角度也会有所不同。

Arduino 控制舵机的方法有两种,一种是通过Arduino 的普通数字传感器接口产生占空比不同的方波,模拟产生PWM 信号进行舵机定位,第二种是直接利用Arduino 自带的Servo 函数进行舵机的控制,这种控制方法的优点在于程序编写,缺点是只能控制2 路舵机,因为Arduino 自带函数只能利用数字910 接口。

因为后续打算4个脚走路不稳的话给虫子再多加几条腿,所以本文使用第一种pwm脉冲宽度调制的方法控制舵机。

连线方法

如图所示,舵机,棕、红、橙线分别接GND、5V、8号端口

先用一个舵机进行测试,成功后再用两个舵机测试。

我在测试后顺便加上了红外线控制舵机左转、右转,及按钮按下时亮起led(因为遥控器有点不太灵,我又懒得老去看日志)。

实际连线图

具体代码如下:

#include <IRremote.h>//包含红外库 int infraredPin = 3;//红外线接收器端口 long INFRARED_PLAY = 0x00FFA857;//红外遥控器上的PLAY键指令 long INFRARED_LEFT = 0x00FFE01F;//红外遥控器上的左键指令 long INFRARED_RIGHT = 0x00FF906F;//红外遥控器上的右键指令 long INFRARED_UP = 0x00FF02FD;//红外遥控器上的上键指令 long

阅读全文

小猪学arduino—使用红外线发射和接收装置

yaokong

之前我们学习了如何 使用开关控制led灯,这次我们尝试用红外线发射接收装置代替开关 来远程控制led灯。

不同的红外线遥控器的编码方式不同,我们选用了新手常用的NEC协议遥控器:

红外接收装置连线图(led灯连线不再赘述)

如图将VOUT接到10号端口,GND接到实验板上的GND,VCC接到实验板上的+5v

连线效果图:

开发环境安装IRremote扩展

IRremote扩展在硬件上支持多种主控板,软件上支持多种红外协议本,而且便于扩展和用户自定义,使用比较广泛。

搜索并安装IRremote库

增加红外控制代码(红色是变化部分)

#include <IRremote.h>//包含红外库 int onoffPin = 8;//开关输入端口 int infraredPin = 10;//红外线接收器端口 long INFRARED_C = 0x00FFB04F;//红外遥控器上的C键指令 int flickerPin = 9; //闪烁端口 int buzzerPin = 3; //蜂鸣器端口 int orderPin

阅读全文

小猪学arduino—蜂鸣器的使用

上一篇,我们学习了如何使用开关控制led灯,这一次,我们学习一下如何使用蜂鸣器。

蜂鸣器的使用方式和原理与led完全相同,高电平就发出声音,底电平静音,迅速的给高低电平就能发出滴滴类的声音。我们直接使用上一次的连线方法,把端口2位置的led换成蜂鸣器,把端口2的单次高电平改为20ms间隔的滴滴声。

由于连线图除2端口的led变为蜂鸣器外其它无变化就不上图了,代码调整如下:

int onoffPin = 9;//开关输入端口 int flickerPin = 8; //闪烁端口 int buzzerPin = 2; //蜂鸣器端口 int orderPin = 3; //顺序亮起起始端口 int orderLen = 5; //顺序亮起端口个数 int i=0; void setup() { //开关端口初始化 pinMode(onoffPin, INPUT); //闪烁端口初始化 pinMode(flickerPin, OUTPUT); //蜂鸣器端口初始化 pinMode(buzzerPin

阅读全文

小猪学arduino—使用开关控制led灯

IMG_3651

在上一篇arduino学习之—led灯控制中,我们做了用输出口高低电瓶控制led闪烁的尝试,并使用pc发送指令的方法控制led的熄灭。

本篇学习如何利用输入口接收开关装置的信号,替换pc发指令来控制led。具体思路:如果按下开关,顺序亮起所有led灯;否则,闪烁灯每2秒闪烁一次,其它灯熄灭。

具体连线和代码如下:

led.ino

int flickerPin = 8; //闪烁端口 int orderPin = 2; //顺序亮起起始端口 int orderLen = 6; //顺序亮起端口个数 int onoffPin = 9;//开关输入端口 int i=0; void setup() { //开关端口初始化 pinMode(onoffPin, INPUT); //闪烁端初始化 pinMode(flickerPin, OUTPUT); //闪烁端初始化 pinMode(flickerPin, OUTPUT); //顺序亮起端口初始化 for(i

阅读全文

小猪学arduino—led灯控制

IMG_3359

这里使用arduino UNO r3板子+7个电阻+7个led来学习如何实现定时闪烁和顺序亮起。

通过led控制可以了解arduino板子的基本控制和执行原理:GND作为负极来使用,2-13做为可控制的正极来使用。给对应端口高电平即会使通路通电,低电平可以理解为断电。增加电阻是为了降低电流避免烧坏led。

儿子的需求:

默认10端口灯一直保持闪烁,2-7端口灯顺序亮起后保持常亮;发送指令后,所有灯全灭;2秒后,10端口闪烁一次后,2-7端口顺序恢复常亮。

具体连线和代码如下:

led.ino

int flickerPin = 10; //闪烁端口 int orderPin = 2; //顺序亮起起始端口 int orderLen = 6; //顺序亮起端口个数 int i=0; void setup() { Serial.begin(9600); //设置波特率9600,用于接收来自pc的指令 //闪烁端初始化 pinMode(flickerPin, OUTPUT); //顺序亮起端口初始化 for(i= orderPin;i<orderPin+orderLen;i++){ pinMode(i

阅读全文

小猪学arduino—HelloWorld

1 |编写交互示例代码

板子检测监听指定端口,收到‘R’指令时,闪烁LED500毫秒,并打印‘Hello World!’。

代码如下:

int val;//定义变量val int ledpin=13;//定义数字接口13 void setup() { Serial.begin(9600);//设置波特率为9600,这里要跟软件设置相一致。当接入特定设备(如:蓝牙)时,我们也要跟其他设备的波特率达到一致。 pinMode(ledpin,OUTPUT);//设置数字13 口为输出接口,Arduino 上我们用到的I/O

阅读全文

小猪学arduino—Mac OS X系统上Arduino环境搭建

12

1 | 获得Arduino开发板和USB连接线

在这个教程里,我们默认你用的是一块Uno. 如果你使用的是其他电路板,请在开始介绍手册里面阅读对应的内容。

你也可以用一条标准的USB线 (A 接口对B接口),比如说你连接到打印机USB接口用的线。

  

2 | 下载Arduino软件(IDE)

通过下载页面下载最新版Arduino软件(IDE)。

阅读全文