- 2024-09-01
-
加入了学习《【Follow me第二季第1期】作品提交汇总视频》,观看 【Follow me第二季第1期】作品提交汇总
-
发表了主题帖:
【Follow me第二季第1期】作品提交汇总
本帖最后由 Auca 于 2024-9-27 22:10 编辑
物料清单:
1.Adafruit_CircuitPlayground开发板
2.舵机
对本活动的心得体会(包括意见或建议):
这是我第一次参与follow me,也参考了很多论坛大佬的思路,玩开发板最大的问题就可能是找不到参考的资料了,任务的ddl也治好了我的拖延症希望eeworld越办越好,我对想学习嵌入式的学弟学妹推荐的第一个学习路线就是follow me,任务驱动的学习方式很好。
设计思路:需求-> 结合开发板资料定位调用模块/传感器-> 查找文档/示例代码 ->调试
入门任务(必做):开发环境搭建,板载LED点亮
选择的开发环境是Arduino IDE。最近忙秋招压线交任务,能省就省。点灯程序使用Adafruit库中封装好的,按下左按钮就能点亮。
#include <Adafruit_CircuitPlayground.h>
void setup() {
// Initialize the circuit playground
CircuitPlayground.begin();
}
void loop() {
if (CircuitPlayground.leftButton()) {
CircuitPlayground.redLED(HIGH); // LED on
} else {
CircuitPlayground.redLED(LOW); // LED off
}
}
基础任务一(必做):控制板载炫彩LED,跑马灯点亮和颜色变换
程序流程:循环遍历10个LED,每次清空上回LED,点亮当前LED,延时。逆时针点亮红色,顺时针点亮蓝色,实现颜色变换。
#include <Adafruit_CircuitPlayground.h>
void setup() {
CircuitPlayground.begin();
}
void loop() {
for (int i = 0; i < 10; i++) { // 正向跑马灯
CircuitPlayground.clearPixels();
CircuitPlayground.setPixelColor(i, 255, 0, 0); // 红色
delay(100);
}
for (int i = 8; i > 0; i--) { // 反向跑马灯
CircuitPlayground.clearPixels();
CircuitPlayground.setPixelColor(i, 0, 0, 255); // 蓝色
delay(100);
}
}
基础任务二(必做):监测环境温度和光线,通过板载LED展示舒适程度
程序流程:获取温度和光线传感器的数值,如果温度过低/光线过暗,led蓝灯,舒适绿灯,过高红灯。左半部展示温度,右半部展示光线。
#include <Adafruit_CircuitPlayground.h>
void setup() {
CircuitPlayground.begin();
CircuitPlayground.clearPixels();
}
void loop() {
// 获取温度和光线传感器数据
float temperature = CircuitPlayground.temperature(); // 温度传感器读数 (摄氏度)
int lightLevel = CircuitPlayground.lightSensor();
int temp_confort;
int light_confort;
// 判断温度舒适程度
if( temperature < 20 ){
temp_confort = 1;
}
else if (temperature >= 20 && temperature <= 27) {
temp_confort = 2;
}
else{
temp_confort = 3;
}
// 判断光线舒适程度
if( lightLevel < 200 ){
light_confort = 1;
}
else if (lightLevel >= 200 && lightLevel <= 800) {
light_confort = 2;
}
else{
light_confort = 3;
}
setAllPixelsColor(temp_confort, light_confort);
delay(100);
}
void setAllPixelsColor(int temp_confort, int light_confort) {
int red, green, blue;
for (int i = 0; i < 5; i++) {
if( temp_confort == 1) red = 0, green = 0, blue = 255;
else if( temp_confort == 2) red = 0, green = 255, blue = 0;
else red = 255, green = 0, blue = 0;
CircuitPlayground.setPixelColor(i, red, green, blue);
}
for (int i = 5; i < 10; i++) {
if( light_confort == 1) red = 0, green = 0, blue = 255;
else if( light_confort == 2) red = 0, green = 255, blue = 0;
else red = 255, green = 0, blue = 0;
CircuitPlayground.setPixelColor(i, red, green, blue);
}
}
基础任务三(必做):接近检测——设定安全距离并通过板载LED展示,检测到入侵时,发起声音报警
遗憾的是,似乎通过板载的红外是无法做到测距的,因为它是用于红外通讯的?只能实现靠近检测。我也有写过通过发射统计时间来计算红外测距的代码,效果非常灾难,物体反射红外光的程度不同,然后写了一版靠近检测,十分简单,只需要收到信号就报警,但是没有完成安全距离的要求,最后改成了这一版相对距离的。
逻辑:读取模拟传感器值,如果传感器值大于或等于阈值,则点亮LED并报警。
#include <Adafruit_CircuitPlayground.h>
const int analogInPin = A1;
void setup() {
CircuitPlayground.begin();
Serial.begin(9600);
}
void loop() {
int sensorValue = analogRead(analogInPin);
Serial.print("sensorValue: ");
Serial.println(sensorValue);
if (sensorValue >= 500) {
for (int i = 0; i < 2; i++) {
CircuitPlayground.setPixelColor(0, 255, 0, 0);
CircuitPlayground.playTone(262, 300);
CircuitPlayground.clearPixels();
noTone(5);
delay(300);
}
}
delay(100); // 稳定延迟
}
这个不好拍图片,放在下面视频里。
进阶任务(必做):制作不倒翁——展示不倒翁运动过程中的不同灯光效果
比起上面那个,这个就容易很多了
#include <Adafruit_CircuitPlayground.h>
void setup() {
CircuitPlayground.begin();
}
void loop() {
float x = CircuitPlayground.motionX();
float y = CircuitPlayground.motionY();
float z = CircuitPlayground.motionZ();
uint32_t color;
// Determine color based on tilt direction
if (z > 9) {
color = CircuitPlayground.colorWheel(0);
} else if (x > 3) {
color = CircuitPlayground.colorWheel(85);
} else if (x < -3) {
color = CircuitPlayground.colorWheel(170);
} else if (y > 3) {
color = CircuitPlayground.colorWheel(42);
} else if (y < -3) {
color = CircuitPlayground.colorWheel(127);
} else {
color = CircuitPlayground.colorWheel(255);
}
for (int i = 0; i < 10; i++) {
CircuitPlayground.setPixelColor(i, color);
}
delay(100);
}
■ 创意任务二:章鱼哥——章鱼哥的触角根据环境声音的大小,章鱼哥的触角可舒展或者收缩
本来是想用五个舵机的,但是连线太麻烦只用了一个。选取也不太合适,应该选声音变化很大的。
#include <Adafruit_CircuitPlayground.h>
#include <Servo.h>
Servo tentacle1;
void setup() {
tentacle1.attach(A1);
}
void loop() {
int soundLevel = CircuitPlayground.mic.soundPressureLevel(50);
int Pos = map(soundLevel, 50, 120, 0, 180); // 映射角度
tentacle1.write(Pos);
delay(100);
}
- 2024-07-27
-
回复了主题帖:
有高质量的人体工学鼠标推荐吗?
我用的是罗技MX Vertical 用了右手没疼过了,但是最近左手又开始疼了……有个足够深的桌子才是真的
- 2024-07-19
-
回复了主题帖:
ROS笔记1 主要概念
freebsder 发表于 2024-7-18 13:53
去ros化 是个什么说法?
以我目前接触的业内人员和我交流的信息,一般工程上是不会使用ros,ros的实时性不是很好,国内也有对ros进行二次开发的公司。ros工具包固然多,但是换一种说法也就是臃肿。以及上面提到的fast drone根据爱好者的说法效果也没有那么好,不过我刚刚接触飞控也没有实际飞过(也没有钱)。我目前还是准大四,还没有真正做过工程项目,更多的是打比赛和一些老板做原型机,不确定实际情况是不是如我说的这样。
- 2024-07-17
-
回复了主题帖:
ROS笔记1 主要概念
freebsder 发表于 2024-7-17 11:32
ROS资料比较零散。 系统点的资料又比较老。。。
开源很多都是ros1,ros又是和ubuntu强绑定的,ros2感觉一年一个版本了,也就面试有加分项,感觉入职了还是去ros化,除非做科研啥的,可能需要用一些工具
- 2024-07-14
-
回复了主题帖:
ROS笔记1 主要概念
lugl4313820 发表于 2024-7-14 06:55
虽然使用ros打了很多比赛,但是最近秋招面试发现也需要理清楚很多概念性的东西,写一下博客用作记录。
...
ros只是个中间件,很多地方都能用到,比赛用的比较多的在rm里,最近学了一下国内开源飞控fast drone也是基于ros的,也有专项一些的比如机械臂轨迹规划设计到urdf的也可以用到ros的工具,有的岗位对熟悉ros的有加分,梳理一下概念好面试
- 2024-07-13
-
发表了主题帖:
ROS笔记1 主要概念
虽然使用ros打了很多比赛,但是最近秋招面试发现也需要理清楚很多概念性的东西,写一下博客用作记录。
### 松耦合分布式通信
松耦合:(Loose Coupling)是软件工程中的一个概念,指的是模块或组件之间的依赖关系较少或较弱,使得它们可以独立地进行修改、替换或扩展,而不影响其他模块或组件的功能。松耦合的目标是提高系统的可维护性、可扩展性和可重用性。
所有功能可以抽象为节点。
**节点(Node):**
——执行单元
执行具体任务的进程、独立运行的可执行文件;
不同节点可以使用 **不同的编程语言**
节点在系统中的名称必须是 **唯一** 的
**通讯方式**:
**话题(Topic)**:——异步通讯机制
节点间用来传输数据的重要总线
单向,无反馈
使用 *发布/订阅* 模型,数据由发布者传输到订阅者,同一个话题的订阅者或发布者可以 *不唯一*
*消息(Message)*:——话题数据
具有一定类型和数据结构,包括ROS提供的标准类型和用户自定义类型
使用编程语言无关的 *.msg* 文件定义,编程过程中生成对应的代码文件
**服务(Service)**: ——同步通信机制
使用 *客户端/服务器* (C/S)模型,客户端发送 *请求* 数据,服务器完成处理后返回 *应答* 数据
使用编程语言无关的 *.srv* 文件定义请求和应答数据结构,编译过程中生成对应的代码文件
请求一次,返回一次,阻塞等待
| | 话题 | 服务 |
| --- | --- | --- |
| 同步性 | 异步 | 同步 |
| 通信模型 | 发布/订阅 | 服务器/客户端 |
| 底层协议 | ROSTCP/ROSUDP | ROSTCP/ROSUDP |
| 反馈机制 | 无 | 有 |
| 缓冲区 | 有 | 无 |
| 实时性 | 弱 | 强 |
| 节点关系 | 多对多 | 一对多(one server) |
| 适用场景 | 数据传输 | 逻辑处理 |
**功能包(Package):**
ROS软件中的基本单元,包含节点源码、配置文件、数据定义等
**功能包清单(Package manifest)**
记录功能包的基本信息,包含作者信息、许可信息、依赖选项、编译标志等
**元功能包(Meat Packages)**
组织多个用于同一目的的功能包
### ROSCORE
`roscore` 是 ROS(Robot Operating System)中的一个基本命令,用于启动 ROS 核心组件。它是 ROS 系统的核心进程,提供了节点之间通信的基础服务。`roscore` 通常包括以下三个主要组件:
1. **节点管理器(ROS Master)** :——控制中心
- ROS Master 是 ROS 网络的核心部分,负责管理所有节点的注册信息、话题和服务。它提供名称解析服务,允许 ROS 节点查找和连接到其他节点。
- Master 记录了所有发布者、订阅者和服务的信息,当一个节点启动时,它会向 Master 注册自己,并且可以通过 Master 发现和连接其他节点。
- 提供参数服务器,节点使用此服务器存储和检索运行时的参数。
2. **参数服务器(ROS Parameter Server):**
- 可以通过 *网络 API* 访问的共享的 *多变量* 字典。在运行时节点(Nodes)使用此服务器去存储和检索参数。(类似于全局变量,存储多个节点共享的数据。)
- 这对于系统配置和节点初始化非常有用,因为参数服务器允许在启动时和*运行时调整参数*。
- 适合存储静态、非二进制的 *配置参数*,不适合存储动态配置的数据
3. **日志(ROS Logging):**
- 提供日志记录服务,支持节点发布日志消息,以便进行调试和监控。ROS 提供了多种日志级别,如 debug、info、warn、error 和 fatal。
- 日志服务允许开发者跟踪系统运行状态,调试信息和错误消息。
- 2024-03-29
-
加入了学习《[高精度实验室] ADC系列 7 : SAR ADC 功耗分析与计算》,观看 SAR ADC 功耗分析与计算