Robofun 機器人論壇

 找回密碼
 申請會員
搜索
熱搜: 活動 交友 discuz
查看: 5142|回復: 7
打印 上一主題 下一主題

python轉arduino 超音波感測 問題求解~~~

[複製鏈接]
跳轉到指定樓層
1#
發表於 2018-12-13 18:58:14 | 顯示全部樓層 回帖獎勵 |倒序瀏覽 |閱讀模式
本帖最後由 albert000789 於 2018-12-13 19:01 編輯

這幾天在研究python透過firmata協定在arduino上操作感測器,編譯成功後python數值不正確,這下面為我打的code,麻煩大大指點找錯了!

import pyfirmata
import time

board = pyfirmata.Arduino("/dev/ttyACM0")

trigger = board.get_pin("d:10:o")
echo = board.get_pin("d:9:i")
it = pyfirmata.util.Iterator(board)
it.start()
echo.enable_reporting()
def send_trigger_pulse():
    trigger.write(1)
    time.sleep(0.001)
    trigger.write(0)
   
def wait_for_echo(value,count):
    while echo.read() !=value and count>0:
        count=count-1
        

def get_distance():
    send_trigger_pulse()
    wait_for_echo(True,5000)
    start = time.time()
    wait_for_echo(False,5000)
    finish = time.time()
    pulse_len = finish-start
    distance_cm = pulse_len*340*100/2
    distance_in = distance_cm/2.5
    return(distance_cm,distance_in)

while True:
    print("cm=%f\tinches=%f" % get_distance())
    time.sleep(1)
2#
 樓主| 發表於 2018-12-15 15:13:16 | 顯示全部樓層
超新手 發表於 2018-12-14 19:55
firmata 是用 UART 互連的
速度是 57600bps,
也就是就算來回只送一個byte, 也要花約 250us

另外請問有什麼方法可以解決感測器在arduino但是遙控車程式在python上,因為未來需要用到避障功能,不知道二者該如何互通?
目前我可以把arduino上的數據顯示在python上,但是怎麼把那些文字的數據(字串)弄成可以來寫if的讀取值(數值)嗎?因為一些原因我們的感測器必須裝在arduino上,但是遙控車移動的程式碼必須寫在python上
3#
 樓主| 發表於 2018-12-17 19:19:40 | 顯示全部樓層
超新手 發表於 2018-12-15 16:05
1)一定要在Arduino 偵測完超音波, 再把值讀回, 值才會準
所以最簡單的方法就是去改寫 Firmata 的程式
例如 ...

我們在arduino上執行超音波程式,然後用python去讀他的序列埠,我們要的是能夠去判斷由這個序列埠讀出來的值
我們的code無法做出判斷(使用if)怎麼把這些字串轉換成數值,拜託大大了><

import serial
ser=serial.Serial('/dev/ttyACM0',9600,timeout=0.25)


try:
    while 1:
              response = ser.readline()
              print(response)

except KeyboardInterrupt:
          ser.close()
         
if response<100:
    print("Quit")

4#
 樓主| 發表於 2018-12-17 21:52:52 | 顯示全部樓層
本帖最後由 albert000789 於 2018-12-17 21:57 編輯
超新手 發表於 2018-12-17 19:48
response = ser.readline()
a=int(response)
if a


b'6cm\r\n'  我們之前跑出來的結果是長這樣,不是純數字

加上a=int(response)之後就出現 ValueError: invalid literal for int() with base 10: b'6cm\r\n'

該怎麼解決 TT,下面是我們arduino上的code,不知道是不是要改這裡的程式

const byte trigPin = 10;
const int echoPin = 9;
unsigned long d;

unsigned long ping(){
  digitalWrite(trigPin,HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin,LOW);
  
  return pulseIn(echoPin,HIGH);
}
void setup(){
  pinMode(trigPin,OUTPUT);
  pinMode(echoPin,INPUT);
  
  Serial.begin(9600);
}

void loop(){
  d=ping()/58;
  
  Serial.print(d);
  Serial.print("cm");
  Serial.println();
  
  delay(250);
}
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

小黑屋|手機版|Archiver|機器人論壇 from 2005.07

GMT+8, 2024-5-5 03:52 , Processed in 0.217480 second(s), 6 queries , Apc On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表