2

こんにちは、私は Python の初心者ですが、2 年間 Python に興味を持っています。ロボットを作りたいのですが、Python をpyserialBlender で使用しようとしています。しかし、私は問題を見つけ、Google とこのサイトで 2 時間答えを探した後、私はそれを解決できないために遅れている可能性があることに気付きました。まだ求められていないと思います。

私は devantech sd84 サーボ コントローラーを使用しており、USB ポート経由でシリアル デバイスを制御しているので、pyserial. 問題は、Python にユーザー入力から 10 進値を取得させたいことです。その400方法2200はわかっていますが、Python でそれを 2 バイトとして表示し、最初に下位バイトを送信してから上位バイトを送信する必要があります。たとえば(まだプログラムする方法がわからないため、疑似コード)

    #ask for a decimal number between a range (the range does not really matters)
    x = raw_input('\tInsert a number between 400-2200:') #Insert a number between 400-2200: 1500
    #show it as hex
    hex(x) #5dc
    #put it in two bytes and in this case add a zero(?) I don't know how to do that.
    0xDC 0x05
    #add it to a 16-bit integer to send it to the servo controller via the virtual serial port(?) i also don't know how to do that. 
   ser.write('\xAA\xA0\x55\x01\x01\x02\xDC\x05')

同じコントローラーを持っている人の興味のために、16 ビット整数の最初の 3 バイトが同期(\xAA\xA0\x55)であり、次にコマンドのタイプ SET_SERVO (位置) (\x01)、次に 1 のチャネル 1-84 が (\x01) であることを説明します。この場合のバイト数は 2 (\x02) で、サーボ位置の下位バイト、次に上位バイト (\xDC\x05) で、最近はアプリを使って iPod で計算し、手動で挿入します。ばかげたことで、彼に私のためにそれをさせてください。

ここで、テスト目的で作成したコードを投稿します。これにより、チャネル1のサーボがさまざまな速度でフルレンジになり、サーボが「踊る」間、スペイン語で面白いものを出力します。位置を手動で計算して挿入しました。ハハハは歴史のように聞こえます私のため。

    # -*- coding: utf-8 -*-
    #Pablo P. 2012 "bailecillo"
    #mueve un servo en el canal 1 a través de todo su recorido e imprime frases mientras dicho servo "baila"
    import serial
    import time
    # Para cambiar de Sistema Operativo cambiar puerto 
    #en la siguiente línea: Win COM# linux /dev/ttyS# /dev/ttyUSB#
    # #=un número asignado por tu sistema.
    port='COM3'
    sync='\xAA\xA0\x55'
    SET_SERVO='\x01'
    GET_SERVO='\x02'
    SET_SPEED='\x03'
    SET_MODE='\x04'
    GET_MODE='\x05'
    SET_AD_CNT='\x06' #Controla el número de canales analógicos.
    GET_AD_CNT='\x07' #Devuelve el número de canales analógicos actuales.
    GET_INPUT='\X08' # Devuelve el estado de una entrada.
    GET_ADC='\X09' #Devuelve el valor de un canal analógico.
    GET_VERSION='\x0A' #Devuelve la versión del procesador seleccionado.
    GET_BULK='\x15' #Usado para test en fábriica.
    TEST='\X16' #Usado para test en fábrica.
    ser = serial.Serial(port, baudrate=115200, bytesize=8, parity='N', stopbits=2,timeout=1)

   print "Hola! me alegro de verte."
   time.sleep(2)

   if ser.isOpen():
print "Estado del puerto: Correcto."
time.sleep(1)
print "Procedo a enviar modo del canal 1 y posicion(es) del mismo."
time.sleep(3)
print "Comprobando sistemas de baile..."
ser.write(sync+SET_MODE+'\x01\x01\x19')
ser.write(sync+SET_SERVO+'\x01\x02\x98\x08') #izda
time.sleep(3)
ser.write(sync+SET_SERVO+'\x01\x02\x90\x01') #derecha
time.sleep(1)
ser.write(sync+SET_SPEED+'\x01\x01\x10')
ser.write(sync+SET_SERVO+'\x01\x02\x78\x05') #centro
time.sleep(2)
print "Vamos a bailar!"
time.sleep(2)
print "preparados..."
time.sleep(1)
print "listos..."
time.sleep(1)
print "Yaaaa!!"
ser.write(sync+SET_SERVO+'\x01\x02\x98\x08') #izda
time.sleep(3)
ser.write(sync+SET_SERVO+'\x01\x02\x90\x01') #derecha
time.sleep(3)
ser.write(sync+SET_SERVO+'\x01\x02\x98\x08') #izda
time.sleep(3)
ser.write(sync+SET_SERVO+'\x01\x02\x90\x01') #derecha
time.sleep(3)
ser.write(sync+SET_SERVO+'\x01\x02\x98\x08') #izda
time.sleep(3)
ser.write(sync+SET_SERVO+'\x01\x02\x90\x01') #derecha
time.sleep(3)
ser.write(sync+SET_SERVO+'\x01\x02\x78\x05') #centro
time.sleep(3)
ser.write(sync+SET_SPEED+'\x01\x01\x00')
ser.close()
time.sleep(1)
print "Todo el proceso completado correctamente."

    else:
        print "El puertito está cerrado"

    print "Hasta Luego :D"
4

2 に答える 2

9

これが、Python を初めて使用するプログラマーがlibrefに目を通す必要がある理由です。

>>> struct.pack('<h', 1500)
'\xdc\x05'
于 2012-08-18T17:20:03.007 に答える
0

これにより、入力整数xに対応する16進文字列が作成されます。

hex_list = ['%02X' % int((hex(int(hex(x)[2:],16) >> i & 0xff)[2:]),16) for i in (0,8)]

string = ''
for element in hex_list:
    string = string + '\\x' + element

string.decode('string_escape')

また

hex_list = ''.join(["\\x" + ('%02X' % int((hex(int(hex(x)[2:],16) >> i & 0xff)[2:]),16) )  for i in (0,8)]).decode('string_escape')
于 2012-08-18T17:26:21.220 に答える