用键盘控制ESP32亮灯

ESP32 模拟键盘的简单操作 (ESP32 for Arduino) 基于 ESP32 的蓝牙键盘的小方案!!! 阅读详情

编辑上位机

1.建立package

source /opt/ros/humble/setup.bash
ros2 pkg create --build-type ament_python my_ros_py_package

2.有一个通过键盘按键值转换为ASCII值的节点发布topic消息

命名为 keyboard_asc_publisher.py

import rclpy
from rclpy.node import Node
from std_msgs.msg import Int32
from pynput import keyboard

class KeyboardPublisher(Node):
    def __init__(self):
        super().__init__('keyboard_publisher')
        self.publisher_ = self.create_publisher(Int32, 'topic_name', 10)
        self.listener = keyboard.Listener(on_press=self.on_press)
        self.listener.start()

    def on_press(self, key):
        if hasattr(key, 'char') and key.char:
            key_char = key.char
            ascii_value = ord(key_char)
            msg = Int32()
            msg.data = ascii_value
            self.publisher_.publish(msg)
            self.get_logger().info(f'Publishing: {msg.data}')

def main(args=None):
    rclpy.init(args=args)
    node = KeyboardPublisher()

    try:
        rclpy.spin(node)
    except KeyboardInterrupt:
        pass
    finally:
        node.listener.stop()
        node.destroy_node()
        rclpy.shutdown()

if __name__ == '__main__':
    main()

3. 如果需要的话,可以在上位机上创建一个subscriber,来查看收到的消息:

subscriber.py

import rclpy
from rclpy.node import Node
from std_msgs.msg import String

class MySubscriber(Node):
    def __init__(self):
        super().__init__('my_subscriber_node')
        self.subscription = self.create_subscription(
            int,
            'topic_name',
            self.listener_callback,
            10)
        self.subscription  # prevent unused variable warning

    def listener_callback(self, msg):
        self.get_logger().info(f"I heard: '{msg.data}'")

def main(args=None):
    rclpy.init(args=args)
    node = MySubscriber()
    rclpy.spin(node)
    rclpy.shutdown()

if __name__ == '__main__':
    main()

4.编写一个launch 可以同时运行这两个节点(node)

(1)创建launch目录

mkdir -p my_ros_py_package/launch

(2)编写launch文件

在launch目录中创建一个新的Python文件,例如my_launch.py,然后添加以下内容:

touch my_launch.py
from launch import LaunchDescription
from launch_ros.actions import Node

def generate_launch_description():
    return LaunchDescription([
        Node(
            package='my_ros_py_package',
            executable='subscriber',
            name='subscriber_node'
        ),
        Node(
            package='my_ros_py_package',
            executable='keyboard_asc_publisher',
            name='keyboard_asc_publisher_node'
        )
    ])

(3)确保launch文件在正确的位置

my_ros_py_package/
|-- launch/
|   |-- my_launch.py
|-- my_ros_py_package/
|   |-- __init__.py
|   |-- subscriber.py
|   |-- keyboard_publisher.py
|   |-- keyboard_asc_publisher.py
|-- setup.py
|-- package.xml

(4)在setup.py中声明launch文件

修改setup.py文件,以确保launch文件夹中的文件被正确安装。在data_files参数中添加一个条目来包含launch目录:

from setuptools import setup, find_packages

package_name = 'my_ros_py_package'

setup(
    name=package_name,
    # other setup parameters...
    data_files=[
        ('share/ament_index/resource_index/packages',
            ['resource/' + package_name]),
        ('share/' + package_name, ['package.xml']),
        ('share/' + package_name + '/launch', ['launch/my_launch.py']),  # Add this line
    ],
    # other setup parameters...
)

(5)重新构建和安装包

在更改setup.py文件后,您需要重新构建和安装您的ROS 2包:

cd ~/Documents/topicComTest  # Adjust this path to where your workspace is
colcon build 

(6)运行launch文件

现在应该可以运行launch文件了:

ros2 launch my_ros_py_package my_launch.py

如果不出意外的话,应该可以看到2个节点和一个topic已经运行起来了。这个时候可以运行rqt_graph来查看已经运行的节点和topic。
类似下图:
这张图是只有一个发布节点和一个订阅节点

编辑下位机(esp32)

1. 新建工程 并 添加支持库

[env:featheresp32]
platform = espressif32
board = featheresp32
framework = arduino
lib_deps = 
    https://gitee.com/harebert/micro_ros_platformio.git

2.编写main.cpp

#include <Arduino.h>
#include <micro_ros_platformio.h>

#include <rcl/rcl.h>
#include <rclc/rclc.h>
#include <rclc/executor.h>

#include <std_msgs/msg/int32.h>

rclc_executor_t executor;
rclc_support_t support;
rcl_allocator_t allocator;
rcl_node_t node;
// 声明话题订阅者
rcl_subscription_t subscriber;
// 声明消息文件
std_msgs__msg__Int32 sub_msg;
// 定义话题接收回调函数
void callback_subscription_(const void *msgin)
{
  const std_msgs__msg__Int32 *msg = (const std_msgs__msg__Int32 *)msgin;
  if (msg->data > 100)
  {
    digitalWrite(2, HIGH); //如果接受到的值大于100,即大于d,则灭灯
  }
  else
  {
    digitalWrite(2, LOW);//如果接受到的值小于100,即小于等于d,则亮灯
  }
}

void setup()
{
  Serial.begin(115200);
  // 设置通过串口进行MicroROS通信
  set_microros_serial_transports(Serial);
  // 延时时一段时间,等待设置完成
  delay(2000);
  // 初始化内存分配器
  allocator = rcl_get_default_allocator();
  // 创建初始化选项
  rclc_support_init(&support, 0, NULL, &allocator);
  // 创建节点 topic_sub_test
  rclc_node_init_default(&node, "esp32Car", "", &support);
  // 订阅者初始化
  rclc_subscription_init_default(
      &subscriber,
      &node,
      ROSIDL_GET_MSG_TYPE_SUPPORT(std_msgs, msg, Int32),
      "topic_name");
  // 创建执行器
  rclc_executor_init(&executor, &support.context, 1, &allocator);
  // 为执行器添加一个订阅者
  rclc_executor_add_subscription(&executor, &subscriber, &sub_msg, &callback_subscription_, ON_NEW_DATA);
  // 初始化LED
  pinMode(2, OUTPUT);
}

void loop()
{
  delay(100);
  // 循环处理数据
  rclc_executor_spin_some(&executor, RCL_MS_TO_NS(100));
}

保存编译并上传。

建立上位机和下位机的联系

Agen其实就是一个代理,微控制器可以通过串口,蓝牙、以太网、Wifi等多种协议将数据传递给Agent,Agent再将其转换成ROS2的话题等数据,以此完成通信。
在这里插入图片描述
所以接下里打开新的终端,并且运行agent

sudo docker run -it --rm -v /dev:/dev -v /dev/shm:/dev/shm --privileged --net=host microros/micro-ros-agent:$ROS_DISTRO serial --dev /dev/ttyUSB0 -v

完成

esp32-s3蓝牙键盘 阅读详情

相关推荐

《ESP32 学习笔记》 之 ESP32 模拟 蓝牙键盘-Keyboard

ESP32 模拟 蓝牙键盘-Keyboard

qq_41868901的博客 3万+

ESP32-模拟键盘操作

模拟键盘操作是开发中常用的功能之一。今天我使用 ESP32 单片机,结合 ESP32-BLE-Keyboard 库进行了一次测试,并成功实现了该功能。现在将我的测试过程整理分享给大家,希望对大家有所帮助。

m0_59806124的博客 2862

89C51单片机全自动洗衣机控制全套开发资料(Proteus仿真+Keil工程+原理图PCB参考)

一套面向嵌入式初学者和课程设计使用的89C51洗衣机控制系统实践资源,包含多个可运行的Proteus仿真文件(.DSN),能真实模拟进水、排水、电机正反转、水位检测、洗涤/漂洗/脱水三阶段时序逻辑,以及完整的Keil C51工程(.uvproj/.hex/.lst等),支持一键编译与烧录。代码采用模块化设计,涵盖主控流程、独立按键扫描、LED工作状态指示、蜂鸣器操作提示等功能,变量与逻辑均有中文注释,便于理解与修改。配套提供Protel 99SE格式的.PWI原理图和.PDSPrj项目文件,可用于后续PCB

pear55的博客 241

ESP32秒变蓝牙键盘,太简单了!万物皆可一键三连???

ESP32秒变蓝牙键盘,太简单了!万物皆可一键三连???通过上述步骤,您已成功将ESP32转变为一个可以通过蓝牙控制的键盘设备,可用于各种创意项目和自动化场景中。继续探索HID库的功能,可以进一步拓展其应用边界。

MHP668的博客 5390

别再被无限debugger卡住了!Chrome DevTools实战绕过技巧(含Hook与文件替换)

本文详细介绍了如何通过Chrome DevTools绕过无限debugger封锁的实战技巧,包括Hook技术与文件替换方法。针对常见的定时器轰炸、循环陷阱和动态注入等反调试手段,提供了高效的解决方案,帮助开发者快速突破调试障碍,提升爬虫和逆向工程效率。

weixin_30326515的博客 241

Uncertainty-Aware Mean Teacher(UA-MT)

本文提出了一种新的基于不确定性的半监督学习框架(UA-MT),通过额外利用未标记的数据从3D MR图像中分割左心房。具体地说,本文建立了一个教师模型和一个学生模型,学生模型通过最小化标注数据上的分割监督损失和所有输入数据上的与教师模型预测输出的一致性损失进行优化。如果没有未标记输入中的注释,教师模型的预测目标可能不可靠且有噪声。:在估计不确定性 U 的指导下,我们过滤掉相对不可靠**(高不确定性),整个体积** U 的不确定性**是 {u} ∈ RH×W ×D。过滤掉高不确定性的,也就是熵大于某个值的。

Alexa_的博客 1869

零知派ESP32--通过I2C 接口扩展芯片PCF8575使用矩阵键盘控制LED

本项目基于ESP32主控,通过PCF8575扩展16路I/O接口,实现了键盘输入、LED/RGB控制、人体感应和屏幕显示的多功能集成系统。系统支持自动和手动两种模式:自动模式下通过人体感应控制LED开关,手动模式下可通过4×4矩阵键盘独立控制LED和RGB灯效。项目创新性地在单颗扩展芯片上实现了I/O扩展、键盘扫描、传感器联动和图形界面刷新等功能,并采用软件消抖、状态分区刷新等技术优化用户体验。系统具有状态实时显示、按键容错处理等特点,展示了I2C扩展器在复杂嵌入式系统中的高效应用。

LingzhiPi的博客 547

从0到1:.NET 9 OpenAPI全攻略!Swagger vs Scalar UI谁更强?

OpenAPI:.NET 9的智能文档革命 本文深入解析.NET 9的OpenAPI支持,对比Swagger UI与Scalar UI的优劣,提供实战代码示例: 一键生成:AddOpenApi()+MapOpenApi()快速生成标准文档 UI工具对决: Swagger UI功能全面但复杂 Scalar UI简约现代,原生支持cURL/HTTPie 进阶技巧: XML注释增强文档可读性 自定义Transformer实现文档动态修改 🔥核心价值:.NET 9的OpenAPI方案显著降低API文档维护成本,开

java专栏 1427

从Arduino到ESP32:构建模块化智能空间交互系统的完整指南

在物联网和智能硬件领域,嵌入式系统开发是实现设备智能化的核心技术。其原理是通过微控制器(如Arduino、ESP32)作为核心大脑,连接传感器、执行器等外围模块,运行特定程序逻辑,实现对物理世界的感知与控制。这项技术的价值在于能够将传统物件升级为可编程、可交互的智能节点,从而提升生活与工作的便捷性、安全性与体验感。其应用场景广泛,从智能家居中的照明与安防联动,到个性化办公空间的功能集成,都离不开软硬件协同的设计思维。本文以“铜灯书架密码锁”这一具体DIY项目为切入点,深入剖析了如何将**密码锁**作为数字化

hqmln的博客 492

ubuntu18.04 显卡驱动问题 造成屏幕分辨变大 NVIDIA-SMI has failed because it couldn't communicate with ....等问题

问题1:装好了显卡驱动,cudnn,tensorflow等没问题,一直可以用。但是突然有一天不行了,终端输入:nvidia-smi 显示:NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed...

梦萦飞--CV/DL/ML 2248

STM32家电安全开发实战:手把手教你用X-CUBE-CLASSB通过IEC60730 Class B认证

本文详细解析了如何使用STM32的X-CUBE-CLASSB软件包通过IEC60730 Class B认证,涵盖认证核心要求、软件包架构、工程集成配置及调试技巧。针对家电安全开发,提供了从单元测试到压力测试的全流程方案,帮助开发者快速实现符合国际安全标准的嵌入式控制系统。

pink的博客 704

ESP32物联网密码锁项目实战:从硬件连接到Web控制

物联网技术通过嵌入式系统将物理设备连接到网络,实现智能化控制。其核心原理在于利用微控制器(如ESP32)处理传感器输入,并通过网络协议进行通信。这项技术的价值在于为传统设备赋予远程监控和自动化能力,广泛应用于智能家居、安防和创意硬件等领域。本文聚焦于一个典型的物联网应用——智能密码锁,它结合了嵌入式开发、传感器应用和网络通信。项目涉及ESP32开发板、舵机、LED灯带和矩阵键盘等硬件,通过C++编程实现密码验证和锁具控制,并扩展了Web服务器功能以实现远程管理。文中详细介绍了系统设计、电路连接、代码实现和调

weixin_30421809的博客 403

Ai数字人直播系统搭建,本地源码部署,源码交付--支持OEM系统贴牌

AI 数字人直播系统是利用人工智能技术创建虚拟主播,并通过数字化技术实现直播互动的系统1。以下是其相关介绍:Ai数字人直播系统搭建,本地源码部署,源码交付--支持OEM系统贴牌。

weixin_ggwwsscc的博客 620

基于Arduino与ESP32的智能门锁DIY:从原理到安全实现

在物联网与智能家居领域,嵌入式系统开发是实现设备智能化的核心技术。其原理在于通过微控制器(如单片机)连接传感器与执行器,并借助网络模块实现远程通信与控制,从而赋予传统设备感知、决策与互联能力。这项技术的核心价值在于将物理世界与数字世界无缝连接,为自动化、远程监控与智能场景联动提供了硬件基础。典型的应用场景包括环境监测、安防系统以及各类智能家电的控制。本文聚焦于一个具体且实用的实现案例:基于Arduino Uno与ESP32双核架构的智能门锁系统。该系统通过矩阵键盘输入密码,利用继电器安全驱动电机锁,并实现了

weixin_29188997的博客 297

基于步科(Kinco HMI 2.5)的组态软件使用

本篇介绍Kinco HMI 2.5的组态软件使用,图标如下 目录   一、新建工程并配置连接 1.1 根据工程选择PLC与HMI型号 1.2 配置PLC连接与选项 二、组态画面编辑 2.1 打开画面窗口 2.2 编辑画面 2.3 组态变量与PLC程序变量连接 三、组态程序下载到HMI 3.1 连接 3.2 编译 3.3 下载 一、新建工程并配置连接 1.1 根据工...

ACanswer的专栏 1万+

手把手教你学Simulink——基于经典PID控制的电机系统场景实例:BLDC电机PID电流控制策略仿真

*无刷直流电机(Brushless DC Motor, BLDC)**因其高效率、长寿命和低维护成本,在众多领域如家用电器、工业自动化、电动汽车等得到了广泛应用。为了实现对BLDC电机的有效控制,通常采用基于霍尔传感器或反电动势检测的换相技术,并结合电流闭环控制以提高系统的动态响应和稳定性。本教程将带你使用构建一个基于PID控制的BLDC电机电流控制策略仿真模型BLDC电机建模PID控制器设计与应用系统仿真与调试控制效果分析本文介绍了如何使用构建一个。

MHD0815的博客 196

HiChatBox STEAM教育编程实践课程

HiChatBox是一款基于ESP32的智能交互教学平台,融合语音识别、多模态反馈与云端AI,支持本地唤醒、传感器联动和可编程控制,适用于STEAM教育中从图形化到代码编程的全阶段学习,实现感知、决策与执行的闭环教学。

weixin_36204513的博客 853

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

树莓派+LED灯带:打造带灯光引导的MIDI跟弹键盘

MIDI协议作为数字乐器通信的通用语言,将音符、速度等信息结构化编码,为智能乐器开发提供了标准化输入。基于MIDI文件解析与实时调度,结合嵌入式平台的可编程I/O能力,开发者能够构建响应式灯光引导系统。在DIY电子乐器领域,利用树莓派作为主控,通过Python生态中的mido、python-rtmidi和rpi_ws281x库,可高效实现MIDI消息解析、击键检测与可寻址LED驱动。这种软硬件结合的实践,不仅降低了音乐学习门槛,让琴键上的LED提前亮起指示演奏位置,还能通过命中率统计反馈练习效果。无论是个人

weixin_30487201的博客 365

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

激光移动标靶系统设计:从嵌入式架构到软硬件实现全解析

嵌入式系统作为现代智能设备的核心,通过集成微控制器、传感器与执行器,实现对物理世界的感知与控制。其工作原理基于实时数据采集、处理与响应,技术价值在于将抽象算法转化为具体的硬件交互,广泛应用于机器人、物联网和智能交互设备。在工程实践中,系统架构设计与软硬件协同是关键,涉及电机驱动、传感器阵列和无线通信等核心模块。本文以激光移动标靶为例,深入探讨了基于ESP32的差速运动控制、激光接收模块阵列的矩阵扫描方案,以及通过Wi-Fi实现多设备交互的实战应用,为嵌入式开发与智能硬件项目提供了一套完整的实现路径与调试指南

weixin_34197488的博客 372

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

从零实现USB主机识别:手把手入门实践教程

深入浅出讲解usb协议核心机制,通过实际操作引导读者从零完成USB主机识别,适合初学者掌握usb协议的底层交互过程。

weixin_35433448的博客 668

DIY可编程电子鼓:从压电传感器到MIDI控制的全流程制作指南

在嵌入式系统与电子乐器开发领域,传感器技术、单片机编程和通信协议是实现硬件交互的核心基础。压电陶瓷传感器利用压电效应将机械能转换为电信号,是检测冲击和振动的常用元件;而MIDI(乐器数字接口)作为行业标准协议,负责在设备间传输音符、力度等控制指令,而非音频流本身。这些技术的工程价值在于能够构建高度定制化、低延迟的实时交互系统。在音乐科技、互动装置和创客项目中,结合传感器与单片机(如Arduino)可以开发出自定义的MIDI控制器,例如一套可编程电子鼓。本项目正是基于这一思路,详细讲解了如何使用压电片作为打击

weixin_30307921的博客 406

从创客项目到实用产品:硬件方案选型与嵌入式开发实战解析

在嵌入式系统与物联网开发领域,硬件方案选型是项目成功的关键基础。其核心原理在于根据具体功能需求,将抽象问题映射为可执行的技术指标,并权衡性能、成本与开发复杂度。这一过程的技术价值在于,它能帮助开发者规避常见陷阱,构建稳定可靠的系统,从而将创意高效转化为实用产品。典型的应用场景包括智能家居控制、人机交互设备以及个性化数码产品等。本文以声控鼠标、自动灯控和复古怀表三个具体项目为例,深入剖析了从需求拆解到传感器选型、主控配置及电源设计的完整逻辑,并重点探讨了如何利用Arduino Leonardo的USB HID

weixin_34295316的博客 478

什么是Arduino以及它的用途

优势描述易用性代码简单、硬件连接清晰低成本开发板和模块价格便宜社区资源丰富有大量开源项目、教程、文档跨平台支持多种操作系统使用 IDE模块丰富支持各种传感器、执行器模块,方便扩展下面我会带打击做一个小项目,用几行简单的代码完成一个Arduino 温度监控仪项目。

王景程的博客 3642

基于Arduino与光敏电阻的智能防盗灯DIY:从原理到安防实践

传感器技术是物联网与智能家居的基石,它赋予设备感知物理世界的能力。光敏电阻作为一种经典的光线传感器,其工作原理基于内光电效应,电阻值随光照强度变化,通过分压电路可将光照变化转化为可测量的电压信号。在嵌入式开发中,利用Arduino等开源硬件平台读取该信号,并编写控制逻辑,是实现环境响应式自动化的常见方法。这种技术组合具有极高的工程价值,能够以极低的成本和硬件门槛,将普通设备升级为智能终端,广泛应用于节能控制、环境监测等领域。本文聚焦于一个典型的安防应用场景——模拟有人在家以威慑潜在入侵,详细展示了如何将光敏

weixin_33137081的博客 276

51单片机入门指南:从核心架构到项目实战的嵌入式开发基础

微控制器(MCU)作为嵌入式系统的核心,负责执行控制逻辑并与物理世界交互。其工作原理基于CPU、存储器和I/O口的协同,通过时钟电路同步,并利用中断机制实现实时响应。在技术价值上,MCU因其结构简单、成本低廉和实时性强的特点,成为控制领域的基石。应用场景广泛覆盖从智能家居到工业自动化。本文以经典的51单片机为例,深入解析其最小系统搭建、外设编程如数码管动态扫描与矩阵键盘消抖,并探讨了PWM生成与低功耗设计等进阶话题,为嵌入式开发奠定坚实基础。

weixin_33744854的博客 347

AI智能棋盘通过Microchip PIC32MX运行Harmony框架

本文介绍如何利用Microchip PIC32MX微控制器与MPLAB Harmony框架,构建低延迟、高可靠性的AI智能棋盘。通过行列扫描技术识别落子,结合本地决策与AI交互,实现在无摄像头条件下的高效感知与反馈,适用于教育、无障碍等场景。

weixin_42514540的博客 392
上一篇: Cinema 4D Design第一课 绘制样条曲线
下一篇: 发送Topic指令 控制OLED显示
harebert
博客等级 码龄19年 208粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值