查看: 16|回复: 0
打印 上一主题 下一主题

servo hat作为模拟指针与SitickV的串口实验

[复制链接]
  • TA的每日心情
    无聊
    2019-8-12 13:52
  • 签到天数: 1 天

    [LV.1]初来乍到

    跳转到指定楼层
    楼主
    发表于 2019-9-27 17:02 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    ? ? servo-hat是一款舵机模块,通过esp32的ledc可以直接输出PWM进行控制标称输出角度为145°±10°,实测可以达到170多度。由于ledc配置比较简单因此没有封装库,使用前简单配置一下参数。

    kittenblock中小学创客名师推荐的图形化编程软件

    #define COUNT_LOW 1800
    #define COUNT_HIGH 8000
    #define TIMER_WIDTH 16
    #include "esp32-hal-ledc.h"
    #include 
    
    void setup() {
    ??// put your setup code here, to run once:
    ??M5.begin();
    ??ledcSetup(1, 50, TIMER_WIDTH);
    ??ledcAttachPin(26, 1);? ?? ?? ???/
    ??M5.Lcd.setCursor(20, 80, 2);
    ??M5.Lcd.print("SERVO");
    
    }
    
    void loop() {
    ??// put your main code here, to run repeatedly:
    ? ? for(int i = COUNT_LOW; i < COUNT_HIGH; i = i+100){
    ? ?? ?ledcWrite(1, i);
    ? ? delay(50);
    ? ? }
    }


    有了以上的基础,接下来做一个虚拟指针。最终实现效果为根据Stickv识别的物体,由舵机指向该物体。StickV有GROVE输出,可自由配置IO控制舵机,但由于servo-hat需要配合StickC,因此将StickV的GROVE配置为UART与StickC进行通信,StickC根据接收信息控制舵机。


    首先需要对StickV进行模型训练操作,具体方法参考V-TRAINING
    https://docs.m5stack.com/#/en/related_documents/v-training


    模型训练好以后修改boot.py,通过fpioa_manager配置UART,CONNEXT_A为RX,CONNEXT_B为TX


    kittenblock中小学创客名师推荐的图形化编程软件

    import image
    import lcd
    import sensor
    import sys
    import time
    import KPU as kpu
    from fpioa_manager import fm
    from machine import UART
    
    fm.register(board_info.CONNEXT_A,fm.fpioa.UART1_RX)
    fm.register(board_info.CONNEXT_B,fm.fpioa.UART1_TX)
    
    uart_A = UART(UART.UART1, 115200)
    
    lcd.init()
    lcd.rotation(2)
    
    try:
    ? ? img = image.Image("/sd/startup.jpg")
    ? ? lcd.display(img)
    except:
    ? ? lcd.draw_string(lcd.width()//2-100,lcd.height()//2-4, "Error: Cannot find start.jpg", lcd.WHITE, lcd.RED)
    
    
    task = kpu.load("/sd/b7fbf3aad4caf26a_mbnet10_quant.kmodel")
    
    labels=["M5Stack Fire","M5StickC","M5Stick"] #You can check the numbers here to real names.
    
    sensor.reset()
    sensor.set_pixformat(sensor.RGB565)
    sensor.set_framesize(sensor.QVGA)
    sensor.set_windowing((224, 224))
    sensor.run(1)
    
    lcd.clear()
    
    
    while(True):
    ? ? img = sensor.snapshot()
    ? ? fmap = kpu.forward(task, img)
    ? ? plist=fmap[:]
    ? ? pmax=max(plist)
    ? ? max_index=plist.index(pmax)
    ? ? a = lcd.display(img)
    ? ? uart_A.write('clear')
    ? ? uart_A.write('\r')
    ? ? if pmax > 0.95:
    ? ?? ???lcd.draw_string(5, 60, "Accu:%.2f Type:%s"%(pmax, labels[max_index].strip()))? ???
    ? ?? ???uart_A.write(labels[max_index])
    ? ?? ???uart_A.write('\r')
    
    a = kpu.deinit(task)
    

    本例训练了3个模型,分别为M5Stack Fire,M5StickC,M5Stick。识别到目标后串口输出目标对象。

    接下来进行StickC端的代码编写,配置ledc,对串口字符进行处理,这里对串口数据转换为字符串进行对比,根据结果控制舵机旋转指定的位置

    kittenblock中小学创客名师推荐的图形化编程软件

    
    #include "esp32-hal-ledc.h"
    #include 
    
    #define TIMER_WIDTH 16? ?//精度
    #define CHANNEL 0? ?? ???//通道
    #define FREQUANCE 50??//频率
    #define PIN 26? ???//舵机引脚
    
    
    String comData = "";
    String lastContent = "";
    bool flag;
    void setup() {
    ??M5.begin();
    ??// Serial2.begin(unsigned long baud, uint32_t config, int8_t rxPin, int8_t txPin, bool invert)
    ??Serial2.begin(115200, SERIAL_8N1, 33, 32);? ?? ?//串口2初始化操作
    ??ledcSetup(CHANNEL, FREQUANCE, TIMER_WIDTH);
    ??ledcAttachPin(PIN, CHANNEL);
    }
    
    void loop() {
    ??if(Serial2.available()){
    ? ? comData = "";
    ? ? while(Serial2.available()){
    ? ? char ch = Serial2.read();
    ? ?? ?if(ch != '\r'){
    ? ?? ???comData += ch;
    ? ?? ?}
    ? ? }
    ? ? if(comData == "clear"){
    ? ?? ? M5.Lcd.fillScreen(BLACK);
    ? ?? ? comData = "";
    ? ?? ? ledcWrite(CHANNEL, 8000);
    ? ?? ? return;? ???
    ? ? }
    ? ???if(lastContent != comData){
    ? ?? ???M5.Lcd.setCursor(0, 0);
    ? ?? ???M5.Lcd.print(comData);
    ? ???}? ?? ???
    ? ???if(comData == "M5StickC"){
    ? ?? ???ledcWrite(CHANNEL, 5000);
    ? ?? ?}else if(comData == "M5Stack Fire"){
    ? ?? ???ledcWrite(CHANNEL, 6500);
    ? ?? ?}else if(comData == "M5Stick")
    ? ?? ???ledcWrite(CHANNEL, 8000);
    ? ? }
    }? ? 


    实现效果如下:
    https://www.bilibili.com/video/av69152000/

    您需要登录后才可以回帖 登录 | 立即注册 ?

    本版积分规则

    热门推荐

    关于温湿度传感器在LCD显示上的问题
    关于温湿度传感器在LCD显
    我建立了一个程序,想要将dht11传感器得到的数据显示在LCD1602上,但是LCD显的都是乱
    【原创】全球最小口袋3D打印机mini one直播教程贴
    【原创】全球最小口袋3D打
    最近闲得蛋疼,没事搞个掌上3D打印机,先放效果图吧。 搞了半天,终于能正常打印,
    【Arduino】108种传感器模块系列实验(74)--- 4位LED数码管模块
    【Arduino】108种传感器模
    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是
    (开源)ESP8266改装小风扇,app远程控制+天猫精灵控制
    (开源)ESP8266改装小风
    材料准备 [*]USB风扇一个 [*]ESP8266一块 [*]3.3继电器一块 拆解风扇 第一次,没有
    基于机器视觉的智能分拣机械臂
    基于机器视觉的智能分拣机
    本作品是一个基于机器视觉的智能机械臂操作平台,其采用atmega32单片机作为主控制系统
    Copyright ???2015-2016??Arduino中文社区??Powered by?Discuz! ??( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表