TA的每日心情 | 开心 9 小时前 |
---|
签到天数: 954 天 连续签到: 70 天 [LV.10]以坛为家III
|
本帖最后由 suncat0504 于 2022-12-5 15:30 编辑
感谢艾睿电子和电路城论坛让我有机会使用DFRduino UNO R3开发板。DFRduino UNO R3完全兼容Arduino UNO R3版本(因为内置了Bootloader:Arduino Uno)。也就是说可以使用Arduino对这块开发板进行编程。
一、板卡说明
让我们来看看这块开发板的结构。见下图:
开发板使用Atmega328作为主控,Atmega328是一片高性能、低功耗的AVR 8位微控制器,有32KFlash,这个容量对于普通编程已经足够适用了。片内有1KB的EEPROM,可以在程序运行期间进行动态修改、存储设置数据。芯片支持最高20MHz的时钟频率,开发板使用的是16MHz。芯片内置2KB的RAM。芯片支持1.8V~5.5V的电压范围(开发板可以使用USB电源直接供电以及外置7V~12V的DC输入电压)。
对于开发者而言,开发板以2.54mm间距的排针座方式提供了以下接口:
1)14路数字输入输出口: 工作电压为5V,每一路能输出和接入最大电流为40mA。每一路配置了20-50K欧姆内部上拉电阻(默认不连接)。 除此之外,有些引脚有特定的功能:
·串口信号RX(0号)、TX(1号):与内部 ATmega8U2 USB-to-TTL 芯片相连,提供TTL电压水平的串口接收信号。
·外部中断(2号和3号):''触发中断引脚,可设成上升沿、下降沿或同时触发。可以参看attachInterrupt()函数。
·脉冲宽度调制PWM(3、5、6、9、10 、11):提供6路8位PWM输出,通过analogWrite()函数实现。
·SPI(10(SS),11(MOSI),12(MISO),13(SCK)):这些引脚支持SPI通信接口,可以使用SPI库。
·LED(13号):有个内置的LED灯与数字口13连接,从上图功能图中看出。Arduino专门用于测试LED的保留接口,输出为高时点亮LED,反之输出为低时LED熄灭。
2)6路模拟输入A0到A5: 每一路具有10位的分辨率(即输入有1024个不同值),默认输入信号范围为0到5V,可以通过AREF调整输入上限。 除此之外,有些引脚有特定功能:
·TWI接口(SDA A4和SCL A5):支持通信接口(兼容I2C总线)。可用Wire库
3)AREF:模拟输入信号的参考电压。
4)Reset:信号为低时复位单片机芯片。
二、开发环境配置
介绍完开发板的基本结构,下一步就是准备搭建开发环境了。在搭建开发环境之前,我们需要确认开发板上电后,USB口连接是否正常。因为这个开发板出产比较早,使用的是TypeB 类型的USB接口,所以需要自己另配一条TypeB接口的电缆。连接开发板到计算机上,如果在设备管理器上出现“USB串行设备(COMxx)”,表示开发板已经正常接入计算机,可以使用对应的串口编程开发板了。顺便说一下,这个开发板上电后,板子上标记为:“L”的LED灯会以2秒周期闪烁,很可能是已经预置了的程序在运行。
接下来,我们需要安装Arduino IDE,我这里使用的是1.8.19的版本。安装完成后,启动画面如下:
为了能上传程序到开发板中,需要对Arduino进行必要的设置。主要是以下两个方面:
1、配置开发板管理器网址
通过菜单“文件”--“首选项”--“附加开发板管理器网址”设置。
2、安装管理库
通过菜单“工具”--“管理库”设置。如下图所示
具体的设置方法可以上网查找,这里就不一一叙述了。
如果设置正常,我们可以在打开“工具”菜单的时候,选择开发板,找到和这个开发板型号匹配的选项。这里我们选择“Arduino Uno”即可(如下图所示)。
然后需要选择正确的连接端口(串口),就是在设备管理器中看到的那个串口,我这里是COM31。
为了验证连接、上传是否正常,我们找个例子进行测试。我们选择“BLink”。
IDE会另外打开一个窗口显示这个示例程序。
根据代码,让LED以2秒的间隔进行闪烁。我们直接编译、上传程序,选择工具栏上的第二个右箭头模样的图标,然后等待成功即可。成功后的画面如下:
似乎LED的闪烁没发生什么变化(说明板载的原生态程序就是这个例程)。哈哈哈,没关系,我们可以修改下时间间隔,把1000该成500试试。改完后,继续编译上传,等待完成(如果因为示例程序的只读属性而提示需要重新保存文件,自己选择一个另外的保存位置即可)。上传成功后,可以看到LED的闪烁间隔加快了。
到这一步说明开发环境已经完成,可以放心进行自己的开发了。如果你不太熟悉Arduino的开发,需要花点时间熟悉Arduino的开发语言。
事实上,在DFROBOT的官网上,对这块开发板以及Arduino开发知识都有相关链接可以获得,地址为:https://wiki.dfrobot.com.cn/_SKU_DFR0216_DFRduino_UNO_R3#target_3。
如果你不喜欢编程,还有图形化的编程工具,只需要拖拽一些工具部件、设置必要的参数,一样可以实现编程,非常方便。
比如米思齐这个软件:
在“代码”模式下,你会看到图形化编程形成的对应源代码。
三、驱动马达,转动小车,同时测试光强,采集硅光电池的电压
开发本身具有ADC处理功能,见板子蓝色排孔座,共计6个,编号从0~5。这里我是用A0作为输入口,采集来自硅光电池的输出电压。小车每隔一定时间间隔转动一定角度,同时测量当前位置下的光强,并记录其中最大值。完成一周以上的转动后,继续转动,直到转动到最大值附近后,停止转动,使硅光电池保持朝向最大光强位置。驱动小车马达,使用12、13号IO口。因为使用了电机驱动板,实际只需要在运行时使其中一个IO口产生脉冲数据,就可以使电机转动,带动小车转圈。这个装置的最初目的是为了自动寻找最好的角度获取最大的光强为充电电池充电。
以下是程序代码,完全使用Arduino程序。
- <font size="3">const int analogInPin = A0; // Analog input pin that the potentiometer is attached to
- const int analogOutPin = 9; // Analog output pin that the LED is attached to
-
- const int stepRound=300; // 到达300步,完成一周以上的转动
- const int times=30; // 每次转动的时长ms
-
- int sensorValue = 0; // value read from the pot
- int outputValue = 0; // value output to the PWM (analog out)
- int maxValue=0; // 一周中最大的光强数据
- int stepCount=0; // 计数步数
- int stopFlag=0; // 停转标志
-
- void setup() {
- Serial.begin(9600);
- // 设置马达驱动用IO口
- pinMode(LED_BUILTIN, OUTPUT); // Pin13
- pinMode(12, OUTPUT); // Pin12
-
- // 初始化驱动口
- digitalWrite(13, LOW);
- digitalWrite(12, LOW);
- }
-
- void loop() {
- // 取得光强数据
- sensorValue = analogRead(analogInPin);
- // map it to the range of the analog out:
- outputValue = map(sensorValue, 0, 1023, 0, 255);
- // change the analog out value:
- analogWrite(analogOutPin, outputValue);
-
- // 保存最大值
- if (stepCount < stepRound) {
- if(sensorValue > maxValue){
- maxValue = sensorValue;
- }
- // 继续旋转
- stepCount=stepCount+1;
- digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
- delay(times); // wait for a second
- digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
- delay(times);
-
- } else {
- // 完成一周以上的转角
- if(sensorValue >= maxValue-5){
- // 到了最大值附近,建立停转标志
- stopFlag=1;
- } else {
- if (stopFlag < 1) {
- // 还没有到最大值附近,继续转动
- digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
- delay(times); // wait for a second
- digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
- delay(times);
- }
-
- }
- }
- }</font>
复制代码
实测效果还可以。组装的小车如下图所示。
|
|