iic协议扩展板和pmw引脚控制舵机转向与超声测距的实验,可实现简易超声雷达

iic协议扩展板和pmw引脚控制舵机转向与超声测距的实验,可实现简易超声雷达

//
#include <ST_HW_HC_SR04.h>
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>
#include <Servo.h>
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
Servo myservo; 
// Change the pins if you wish.
ST_HW_HC_SR04 ultrasonicSensor(13, 12); // ST_HW_HC_SR04(TRIG, ECHO)
unsigned int ddd=0;
char dis=16;//分辨率1024/16=64,每个运动周期往返采样两次,期望每秒采128个点,1000/128*34.4=268.76cm(测量范围<=134cm)
void sendToIIC(byte _AAA,byte _aaa,unsigned int _ddd){
  //50hz 相当于20ms(20000us)的 周期,  4096分辨率,分辨率每单位占用时间t 为20000us/4096=4.8828125us
  //舵机控制所需脉宽Th范围0.5~2.5ms(500~2500us)因此高电平分辨率范围就是Th/t =(102.4~512)个单位。
  //取整 最小103 最大512 范围是512-103=409;
  //pwm.setAddr(0x40+_AAA);
  float per=(float)_ddd/1024.0;//参数ddd为10位正整数最大1024
  uint16_t offNum=103+int(409*per);
  //pwm.setPWM(num,on,off);num pmw的id代号,on 上升沿(在0-4096之间)开始位置,off 下降沿在(在0-4096之间)的开始位置
  pwm.setPWM(_aaa, 0, offNum);

}
void setup() {
    Serial.begin(115200);

    while(!Serial); // Wait for the Serial connection;
    ultrasonicSensor.setTimeout(23200);//23.2*34.4=798cm(8m)最大测量范围4m 
    //iic
    pwm.begin();  
    pwm.setPWMFreq(50); 
    //pmw引脚
    myservo.attach(9);  // attaches the servo on pin 9 to the servo object
}

void loop() {
    //iic
    //sendToIIC(0,0,ddd);
    //pmw引脚 scale it to use it with the servo (value between 0 and 180) 
    myservo.write(map(ddd, 0, 1024, 0, 180)); 
  
    ddd+=dis;
    if(ddd>=1024||ddd<=0){
      dis*=-1;
    }
    

  
    int hitTime = ultrasonicSensor.getHitTime(); // In microseconds
    float d=(float)hitTime/1000.0*34.4;
    String message = String(d) + "cm\n";

    /*
    #
    # This means the sensor didn't receive back the packets before the timeout
    #
    #   That usually happens when the distance between the sensor and the block-
    # ing object is greater than 86 centimeters (33.85 inches).
    #
    #   Increasing the timeout from 5000 microseconds to 23200 microseconds
    # will increase the maximum distance to ~4m, at the cost of the code being
    # stuck for 23.2 ms if no packet is received during this period (worst case
    # scenario).
    #
    #   More information (including calculations) is included in the
    # extras/HC-SR04.txt file. (Inside your libraries/ST_HW_HC_SR04 folder)
    #
    */
    if((hitTime == 0) && (ultrasonicSensor.getTimeout() == 5000)) {
        
    }
    //23.2ms声波传播 23.2*34.4=8米,测量4米
    int costTime= hitTime*2/1000;//ms
    if(costTime<7){
      delay((7-costTime)); // 128hz 期望测量周期为7.8125ms (测量范围<=134cm)
    }else{
      //超出期望周期说明测两距离过长。
     //测量周期变长,测量频率减慢 最慢1000/23.2=43hz
     }
    Serial.print(message);

    

}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在ROS中,如果你想通过I2C通信将机载电脑与PCA9685子连接起来,以实现PWM控制舵机转动,你可以按照以下步骤进行操作: 1. 首先,确保你的机载电脑上已经安装了ROS,并且已经配置好了相应的工作空间。 2. 连接PCA9685子到机载电脑的I2C总线上。确保连接正确并稳定。 3. 在ROS中,你可以使用rospy库来编写控制舵机的节点。 4. 创建一个ROS节点,用于与PCA9685子进行通信。在这个节点中,你可以使用rospy库提供的I2C通信功能来发送和接收数据。 5. 在节点中,你需要编写代码来通过I2C发送PWM控制命令给PCA9685子。具体来说,你需要发送适当的I2C数据包来设置PCA9685的寄存器,以控制舵机的转动角度和速度。 6. 通过订阅ROS话题或者接收ROS服务,你可以从其他节点中接收控制舵机的指令。根据指令,你可以相应地调整发送给PCA9685子的PWM控制命令。 7. 在节点中,你还可以编写代码来处理从PCA9685子接收的反馈信息,例如舵机当前位置或状态。 8. 最后,你可以运行ROS节点并观察舵机的转动情况。通过调整发送给PCA9685子的PWM控制命令,你可以实现舵机的精确控制。 需要注意的是,具体的代码实现和配置参数会根据你使用的ROS版本、机载电脑和PCA9685子的具体型号而有所不同。你可以参考ROS和PCA9685子的文档以及相关的ROS包或代码示例来帮助你完成具体的实现

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值