voorloopnul

About Me

My name is Ricardo Pascal, I'm a developer and sysadmin who lives in Florianopolis/Brazil. I enjoy work with projects related to Linux, Python, Science, Web, Django and Network.

g+ A empresa Neoprospecta está contratando 2 desenvolvedores python para trabalhar em projetos de bioinformática... | A empresa Neoway está contratando desenvolvedor Python para trabalhar num projeto web com Django em ... | I wrote a small article showing how to display a form, and create objects from them using views in five... | | A Pixeon está com várias vagas abertas. (Inclusive programador Python). | "When deciding which server architecture to use for your environment, there are many factors to consider... | | Segue uma proposta de lei feita pelo DEPUTADO Missionário José Olimpio. É uma lei que visa nos proteger... | By +Ruben Bolling    http://gocomics.typepad.com/tomthedancingbugblog/ THU MAY 29, 2014 AT 06:50 AM ... | Let's send also some cancer, radioactive material, ebola, Justin Bieber and Brazilian Funk  ¬¬ | "The most extreme case is David Whitlock, the M.I.T.-trained chemical engineer who invented AO+. He ... | If I had 8k euros to spare, I would definitely buy one :) | | Esse link eu salvei nos favoritos. Vale a pena! | Estamos procurando Jedi Back-end Engineer We are looking for a engaged and dedicated software engineer... | django-auth-imap is a package that let you use a IMAP server as backend for authentication in your django... | Would be half-cannibalism if a man made of pig organs eat some bacon? Jokes apart, that's a big news... | "The fact that so many homeless men suffered a TBI before losing their home suggests such injuries could... | I finally found a place with plenty of space to fly my f330, now I just have to lose the fear of flying... | Vaga de emprego para programador python na lett.com.br O serviço que eles oferecem parece interessante... |

Controlling a motor using wifi connection and a gamepad

Hobbyking sells a neat wifi receiver to control planes and cars using android or IOS devices. So I bought one and used my computer and a gamepad to control a motor.

Protocol

A description of the receiver protocol can be found at rcgroups forum

"If someone is interested: The HK Wifi Unit can be used with any WIFI enabled device. Though I do not have a unit, I just checked out the code. The HK Wifi unit waits on IP 10.10.100.254 on port 8899. The socket timeout should be set to 1000ms. One message has a length of 11 bytes. The first 4 bytes are always 85-0-11-0. After that, the values of the 4 channels are transmitted in correct order (channels 1-4). The next 2 bytes (9,10) are not used at all (maybe space for another 2 channels in the future). The last byte is reserved as control byte. All 10 data-bytes are added and transmitted as last byte. I hope I could help you. I do not have the time to develope an android app at this very moment, but it should be really easy. Hope to see some in the near future."

Considerations

  • You can find some info about sockets in my previous post: how not to create a network game
  • If you buy the receiver from this link I will earn some cents to use on my next shop.
  • The Gamepad code requires the Pygame library

    sudo apt-get install python-pygame

Code explanation

  • It will run a loop and check for gamepad input. If you press the square buttom the connection to receiver will be stablished.
  • If you press the circle buttom, the power of all channels will down to 0, the connection will be closed and the loop will end.
  • If you move the left analogic stick in the up direction, the motor will gain a power increment.

The output from gamepad is a float between 0 and 1. I have defined the base power as 50, so for each .1 incremment in gamepad input, the motor increase it power in 5 units going to a maximum of 100.

The code

#!/usr/bin/python
# Part of this code was based on http://dl.dropbox.com/u/815267/wifiHK/wifiHK.py
import socket
import time

class HKProtocol(object):
    def __init__(self):
        self.headerData = [85, 0, 11, 0]
        self.header = ''.join([chr(x) for x in self.headerData])
        self.posData = [0, 0, 0, 0, 0, 0]

    def start(self):
        self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.s.connect(('10.10.100.254', 8899))

    def test_channels(self):
        for i in range(50):
            self.posData = [60, 60, 60, 60, 0, 0]
            self.send()
            time.sleep(0.01)

    def send(self):
        pos = ''.join([chr(x) for x in self.posData])
        checksum = (sum(self.posData) + sum(self.headerData)) % 256
        data = self.header + pos + chr(checksum)
        self.s.send(data)

    def stop(self):
        self.posData = [0, 0, 0, 0, 0, 0]
        self.send()
        self.s.close()
        del(self.s)

if __name__ == "__main__":
    import pygame
    pygame.init()
    j = pygame.joystick.Joystick(0)
    j.init()
    hk = HKProtocol()
    running = False
    while True:
        pygame.event.pump()
        ch1 = int(50 - (j.get_axis(1) * 50))
        ch2, ch3, ch4 = 0, 0, 0

        # Start engine (square button)
        if j.get_button(3):
            if not running:
                running = True
                hk.start()

        # Stop engine (circle button)
        if j.get_button(1):
            if running:
                hk.stop()
            break

        if running:
            hk.posData = [ch1, ch2, ch3, ch4, 0, 0]
            hk.send()
        time.sleep(0.01)

by Ricardo Pascal on Dec 16, 2012

comments powered by Disqus