thecrew

Here are my crew of 3D people so far. Some are prints, some are resin casts. Its quite a bit harder to get good results than I thought. Making molds is an art form unto itself. Click on the picture to see a sharper image.

tablet

tablet-close

Got a new 3D print from Shapeways. This is just one of three, I’ll post the rest up later.

I could not get any of these to print in the cheap white plastic so I had to go up a notch to the translucent-flexible material. I must say the detail is ridiculous but this is a $14 figure. Kinda pricey eh?

bt

I’ve started some development for a new throttle controller, this one is based on an Android tablet for the user interface. My approach is a bit different than what is out there for tablets and smartphones though. I don’t like ‘sliders’ on a touch screen for controlling vehicles, so the idea here is to interface a small analog joystick (the parallax unit) and a potentiometer to do the actual control. The tablet will be used to pull up user interface screens for the locomotives and also have screens for controlling other things.

Basically, I’ve connected a generic bluetooth interface (about $10) to my Xbee Widget controller. The Widget can be configured to have up to 8 analog inputs, I’m using 3 of them here. I have the bluetooth interface on the spare serial port. On the other serial port is the Xbee which actually sends the commands to the locomotive.

I’m using PyGame to build Android apps with because I love Python and do not like Java!

Right now, the only thing on the screen that actually works is the speedometer. This is a screen shot of a Positive Train Control screen I dug up on the internet. I’m not sure what most of the other things on there are so this is just for playing around for now. But hey, it looks neat!

So anyhow, since I looked high and low and found ONE reference on how to scan the BT devices with Android Python, I decided to post up some python source to help out anyone looking to do this. As with most Python things, it’s really quite easy once you get the particulars ironed out.

To use this, just pass in the name of your bt device after you instantiate it. This is the same name you see when you pair your device with your tablet. In my case, it’s ‘HC-06′.



bluetooth = Bluetooth()
bluetooth.prepare("HC-06")
bluetooth.write("--testmessage--")


Here is the method. Note that the UUID in the device create is the same for all BT devices (as far as I know).

Jnius is a nice package that lets you call Java from Python so this could be used for other things besides Bluetooth but that’s another project. I really detest Java (sorry, I’ve worked with Tomcat and did not like it much) so anything I can do to write Android apps in python is great. Android Studio is ok, but MAN is it slow so that is another nail in the Java coffin for me.




#
# Bluetooth interface class for PyGame- Python Android Games and Graphics development
# you will need the jnius python library to use this
#

import pygame
import sqlite3
import math

try:
   import android
   from jnius import autoclass
except:
   android = None

class Bluetooth:
    def __init__(self):
        self.BluetoothAdapter = autoclass('android.bluetooth.BluetoothAdapter') 
        self.BluetoothDevice = autoclass('android.bluetooth.BluetoothDevice')
        self.BluetoothSocket = autoclass('android.bluetooth.BluetoothSocket')
        self.UUID = autoclass('java.util.UUID')
        self.deviceValid = False

    def prepare(self, name):
        paired_devices = self.BluetoothAdapter.getDefaultAdapter().getBondedDevices().toArray()
        for device in paired_devices:
            if device.getName() == name:
               self.socket = device.createRfcommSocketToServiceRecord(self.UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"))
               self.recv_stream = self.socket.getInputStream()
               self.send_stream = self.socket.getOutputStream()
               self.socket.connect()
               self.deviceValid = True

    def write(self, sendString):
        if self.deviceValid:
           self.send_stream.write([ord(b) if ord(b) <= 127 else ord(b)-256 for b in sendString])

    def read(self):
        datastring = ""
        if self.deviceValid:
           c = self.recv_stream.available() 
           if c > 0:
              for i in range(c):
                  datastring = datastring + chr(self.recv_stream.read())
        return datastring
        
    def close(self):
        if self.deviceValid:
           self.socket.close()



Been off the grid for a while but I hope to get back to new projects first of the year or so. In particular I’m looking forward to designing a bluetooth tablet app for controlling my Xbee network and also doing a bit of web work and exploration. I had a bit of surgery a week ago, going to change jobs first of the year and the assorted holiday chaos manifests itself. So I’m pretty much whacked out for a bit.

Finally got my control system tested out in the woods. Very happy with the range. The Xbee will do 300ft and I can’t even see the RS3 if I go that far away. This is my controlwidgets.com design. All the wireless communications are handled by the Xbee. I can send any sort of data to or from anything with this system in real time. Those are 16 byte data packets that are controlling the throttle and coupler servos.

The RS3 has the throttle, front and rear couplers and single channel sound all hooked up and working. All of it is powered by a 5000mah hour LiPoly battery driving a Pololu 18v7 motor controller. The control widget drives the servos directly. There is also an RFID reader under the fuel tank which works quite well too.

3DClones

The results of my latest attempt at mold making and resin casting. 3D print original and his clones. Click on the picture above for a more detailed (and sharper) image. These guys are about 2.5 inches tall or 6 ft in 1:29 G Scale.

I’m trying to get these to a point where I can make consistent resin casts from 3D figure models.

Anyhow, this is the sixth or seventh? iteration of mold making and so far the best. I do think I need to explore some of the finer points of this process but for now I’m finally getting decent results.