搞清楚Ardunio是什么

编程入门 行业动态 更新时间:2024-10-05 21:17:56

搞清楚<a href=https://www.elefans.com/category/jswz/34/1734635.html style=Ardunio是什么"/>

搞清楚Ardunio是什么

arduino

北京创客读书会,Beginning Arduino读书会授课代码 光 声音 通信 显示器 电机舵机 单总线 spi pwm脉冲 以太网 物联网

arduino IOT物联网编程

Arduino 大师

Programming Arduino: Getting Started with Sketches 示例

arduino_course_es 课程 课件

CC1101_arduino 无线模块

Arduino + ESP8266物联网模块 连接无线热点 设置无限热点 套接字和WEB编程等

arduino加显示器制作的小游戏

Ardunio 简介

Arduino 是一款比较流行的开源硬件,相对于传统的硬件平台,Arduino所具有的优势就是采用 Creative Commons 许可。 Creative Commons(CC)是为保护开放版权行为而出现的类似GPL的一种许可(license)。在 Creative Commons许 可下,任何人都被允许生产电路板的复制品,还能重新设计,甚至销售原设计的复制品。Ardunio 其实是包含硬件部分(各种型号的Arduino板)和软件部分(Arduino IDE)。

Arduino板

Ardunio 开发板众多,仅主板就有各种系列,还有各种对应扩展板和传感器。Ardunio 基本都是采用 Atmel 公司的16位及32位芯片。下面是几款主要的Ardunio 发板:

1. 软件安装及教程资源链接

Windows软件下载

Mac os软件下载

驱动安装方法

Arduino教程汇总

Arduino官网

2. Arduino语言

  1. Arduino使用C/C++编写程序,虽然C++兼容C语言,但这是两种语言,C语言是一种面向过程的编程语言,C++是一种面向对象的编程语言。早期的Arduino核心库使用C语言编写,后来引进了面向对象的思想,目前最新的Arduino核心库采用C与C++混合编写而成。

  2. 传统开发方式中,你需要厘清每个寄存器的意义及之间的关系,然后通过配置多个寄存器来达到目的。 而在Arduino中,使用了清楚明了的API替代繁杂的寄存器配置过程,如以下代码: pinMode(13,OUTPUT);digitalwrite(13,HIGH)pinMode(13,OUTPUT)即是设置引脚的模式,这里设定了13脚为输出模式;而digitalWrite(13,HIGH) 是让13脚输出高电平数字信号。

  3. 如果你使用过C/C++语言,你会发现Arduino的程序结构与传统的C/C++结构的不同——Arduino程序中没有main函数。 其实并不是Arduino没有main函数,而是main函数的定义隐藏在了Arduino的核心库文件中。Arduino开发一般不直接操作main函数,而是使用setup()loop()这个两个函 数。

    Arduino控制器通电或复位后,即会开始执行setup() 函数中的程序,该部分只会执行一次。 通常我们会在setup() 函数中完成Arduino的初始化设置,如配置I/O口状态,初始化串口等操作。

    setup() 函数中的程序执行完后,Arduino会接着执行loop() 函数中的程序。而loop()函数是一个死循环,其中的程序会不断的重复运行。 通常我们会在loop() 函数中完成程序的主要功能,如驱动各种模块,采集数据等。

  4. C/C++编程基础(补充)

    常量定义:const 类型 常量名 = 常量值
    布尔型变量,即boolean。它的值只有两个:false(假)和true(真)。boolean会占用1个字节的内存空间。
    

3. 示例总结

io

// LED 延时 闪烁=================
#define LED_ONE 13void setup() {pinMode(LED_ONE, OUTPUT);
}void loop() {digitalWrite(LED_ONE, HIGH);   delay(500);                       digitalWrite(LED_ONE, LOW);    delay(500); 
}// pwm 呼吸灯======================
#define LED_ONE 11 //具有pwm功能int val = 0;
int change = 5;         void setup()
{pinMode(LED_ONE, OUTPUT);   
}void loop()
{val += change;if (val > 250 || val < 5) {change *= -1;}analogWrite(LED_ONE, val); // 0~255/255 * 5vdelay(100);
}//========面对对象编程===========================
// led.h ==================
#ifndef LED_H
#define LED_H#define LED_ONE 3   // 端口
#define LED_TWO 11class Led{int ledPin;long onTime;  // 点亮时间long offTime;public:Led(int pin, long on, long off);// 类构造函数void blinkLed();void turnOn();void turnOff();
};#endif// led.cpp ==================
#include "Arduino.h"
#include "led.h"// 类构造函数====
Led::Led(int pin, long on, long off) {ledPin = pin;pinMode(ledPin, OUTPUT);     onTime = on;offTime = off;
}
// 类方法--灯闪烁
void Led::blinkLed() {this->turnOn();delay(onTime);                       this->turnOff();   delay(offTime); 
}
// 关
void Led::turnOn() {digitalWrite(ledPin, HIGH);  
}
// 开
void Led::turnOff(){digitalWrite(ledPin, LOW); 
}// =====使用类对象==============
#include "led.h"
Led led(LED_ONE, 1000, 500); // 创建led类 对象===
void setup() {// put your setup code here, to run once:
}
void loop() {// put your main code here, to run repeatedly:led.blinkLed();// 调用类的 公有方法
}//  按键输入=========================================
#define BUTTON_ONE 12 // 按键接口 管脚void setup() {// put your setup code here, to run once:Serial.begin(9600);  // 串口pinMode(BUTTON_ONE, INPUT);  // 管脚输入 模式}void loop() {
// 未做消抖处理=====// put your main code here, to run repeatedly:int val = digitalRead(BUTTON_ONE);  // 读取端口状态if (val == HIGH) {         Serial.println("Button HIGH");// 高电平} else {Serial.println("Button LOW"); // 低电平}
}// 模拟量检测 温度测量 结构体================================
#define TEMP_PIN 5
// 温度结构体
struct tmp36_reading {double voltage;double tempC;double tempF;
};void setup() {Serial.begin(9600);
}void loop() {struct tmp36_reading temp;int pinValue = analogRead(TEMP_PIN);// 读取模拟量端口值temp.voltage = pinValue * 0.0049;temp.tempC = (temp.voltage - .5) * 100.0; // 摄氏度temp.tempF = (temp.tempC * 1.8) + 32;     // 华氏度showTemp(temp);delay(2000);
}
// 串口打印信息
void showTemp(struct tmp36_reading temp) {Serial.print(temp.tempC);Serial.print("  -  ");Serial.println(temp.tempF);
}// ==========联合体=================================
union some_data {int i;double d;char s[20];
};void setup() {Serial.begin(9600);union some_data myData;myData.i = 42;myData.d = 3.14;strcpy( myData.s, "Arduino");Serial.println(myData.s);Serial.println(myData.d);Serial.println(myData.i);
}void loop() {// put your main code here, to run repeatedly:}// 开关量检测 ===================================
#define MOTION_SENSOR 3 // 开关量输入===
#define LED 5           // 开关量输出===void setup() {pinMode(MOTION_SENSOR, INPUT);pinMode(LED, OUTPUT);digitalWrite(LED, LOW);Serial.begin(9600);
}void loop() {int sensorValue = digitalRead(MOTION_SENSOR);// 开关量输入测量if (sensorValue == HIGH) {Serial.println("Motion Detected");}digitalWrite(LED, sensorValue);// 开关来输出delay(500);
}

通信

//  单总线协议 DHT 温湿度传感器=======================================
// /Code
#include "DHT.h"#define DHT_PIN 3
#define RAIN_PIN A2
#define DHT_TYPE DHT11
#define RAIN_SENSOR_MAX 1024
#define RAIN_SENSOR_MIN 0
#define RAIN_OUT_MAX 20
#define RAIN_OUT_MIN 0DHT dht(DHT_PIN, DHT_TYPE);void setup() {Serial.begin(9600);dht.begin();
}void loop() {float humidity = dht.readHumidity();float celsius = dht.readTemperature();float fahreheit = dht.readTemperature(true);if (isnan(humidity) || isnan(celsius) || isnan(fahreheit)) {Serial.println("Read Failed");return;}// float hif = dhtputeHeatIndex(fahreheit, humidity);// float hic = dhtputeHeatIndex(celsius, humidity, false);Serial.print("Humidity: ");Serial.println(humidity);Serial.print("Temperature: ");Serial.print(celsius);Serial.println(" *C ");Serial.print(fahreheit);Serial.println(" *F");int rain = analogRead(RAIN_PIN);if (isnan(rain)) {Serial.println("Read Failed");return;}int range = map(rain, RAIN_SENSOR_MIN, RAIN_SENSOR_MAX, RAIN_OUT_MAX, RAIN_OUT_MIN);Serial.print("Rain: ");Serial.println(range);Serial.println("-------------------------");delay(3000);/*Serial.print("Heat index: ");Serial.print(hic);Serial.println(" *C ");Serial.print(hif);Serial.printlnln(" *F");*/}// ==============SPI显示屏====================================
// /Sketch/Nokia5110/Nokia5110.ino
// Nokia5110 <Adafruit_PCD8544.h>// 软件串口--蓝牙通信
//  /BluetoothLELed/BluetoothLELed.ino

Arduino UNO硬件介绍

本想在这一章会对照开发板简单讲解一下硬件原理图,所以如果你想深入了解硬件原理图,这里附上官网的PDF版 。下图是一张原理图和开发板的概览图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-So0cX0D8-1692625315561)(.2.1-1.png)]

稳压电路

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KtIJPyxw-1692625315562)(.2.1-3.png)]

外接电源输入进来的电压可能在5V附近,为了保证更加精准的5V电压,防止电压过高穿透芯片。这里选用的是 NCP117ST50T3G 稳压芯片,这款稳压芯片输出电压可调范围是1.5-12V。稳压电路的连接方式及计算公式可查此链接。

下载电路

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KceNAw2k-1692625315562)(.2.1-4.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K3rc5X8B-1692625315562)(.2.1-5.png)]

这块 UNO 板采用 Atmega16U2 芯片做下载电路,一般我们可能需要单独的下载模块下载程序,但此开发板直接将下载电路集成到了开发板上。这里直接可连 USB 线进行下载,像 Ardunino mini 这种小系统板是需要单独的下载模块的。

主芯片最小系统

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2jSIeoOK-1692625315563)(.2.1-6.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4817MXjU-1692625315563)(.2.1-7.png)]

如上图,这里可以独立出 UNO 的最小系统板,我们编程最关心的就是这个最小系统的 GPIO 接口。晶振的选择几个元器件的选择可参考 Atmega328 数据手册。下图是我们经常操作的一些管脚,比如,我们下一章节将要用的的开发板中的13管脚,它对应的是芯片的19管脚,B端口的第五个管脚,而除了作为普通的 IO 管脚外,它的第二功能就是SCK(同步时钟),SPI通信中作为时钟信号。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T7d5dCTy-1692625315563)(.2.1-8.png)]

点亮LED灯

上一节介绍了 Ardunio UNO 的硬件结构,这一节将会写一个 UNO 的 “hello word” 程序,在软件领域通常会以输出 “hello word” 作为开始,而在硬件领域通常是以点亮 LED 灯作为开始。

搭建环境

首先,在编写程序之前,需要下载编译环境和安装驱动。这里以mac为例,具体的下载过程可以参考官方的Getting Started w/ Arduino on Mac OS X。从官方下载IDE时可能需要先捐献才能下载,为了表示对IDE的支持,我捐献了两美元。当然如果你没有信用卡或者其他的合适的支付手段,这里提供一个第三方的下载平台。按照上述方法安装完毕之后,需要再安装串口驱动,下载链接。驱动安装完毕之后,可以检查驱动是否安装成功。插上连接线,输入ls /dev/tty.*

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nwA1vzez-1692625315564)(.2.2-1.png)]

这里是“/dev/tty.usbmodem1421”,驱动安装成功。

更改配置

在编写程序之前,还需要更改一些配置项:

第一步,选择对应的开发板,这里选用的是 UNO 开发板。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bWHSnp1I-1692625315564)(.2.2-2.png)]

第二部,选择对应的下载端口,上面打印的端口是“/dev/tty.usbmodem1421”,这里选择它。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kJgfx0oE-1692625315564)(.2.2-3.png)]

编写程序

Ardunio 采用自己的一套语言规范,程序可以被分解为三个主要部分:结构、值(变量和常量)以及函数。
一般结构中包含两个函数:“setup()”、“loop()”。“setup()” 是在“sketch”开始时被调用的,用于初始化变量、管脚、开始使用库文件等等。这个函数只会在开发板上电或复位时被调用一次。而“loop()”函数则是在“setup()”函数执行完毕后,一直循环执行。点亮 LED 的思路是只需要在程序开始时,将 LED 置于点亮状态。上一章可以看到,UNO 开发板的13管脚连接在 LED 的灯的一端,而 LED 的灯另一端连接到了低电平,也就是说,只需在初始化时,给13管脚上赋上高电平便可完成操作。

// the setup function runs once when you press reset or power the board
void setup() {// initialize digital pin 13 as an output.pinMode(13, OUTPUT);// turn the LED on (HIGH is the voltage level)digitalWrite(13, HIGH);
}// the loop function runs over and over again forever
void loop() {}

编译下载到 UNO 板中,Done,效果如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wLsvOvRN-1692625315565)(.2.2-4.png)]

更多推荐

搞清楚Ardunio是什么

本文发布于:2024-02-27 16:05:52,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1707278.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:Ardunio

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!