Tuesday, 21 March 2017

Pi Zero W

When I installed the SD the Pi Zero W came with from CanaKit, I had a heck of a time getting it working. First, the micro USB hub I had from Amazon basics didn't work.
Then I had to manually load up the wifi config.
I installed libSDL, advmame (thanks Silverman) and fceux and ... performance was crappy.
But I couldn't see anyone else saying Asteroids was broken out the box.
So I tried to install my Pi2 SD...
I learned that older versions of raspbian don't work with the Zero. Not even if you
  • sudo apt-get update
  • sudo apt-get install rpi-update
  • sudo apt-get dist-upgrade
  • sudo rpi-update
    Its because PiZeroW runs best with the latest raspbian build, Jessie. It doesn't like the old build, Wheezy as the wifi is flakey.
    So after a couple flips of build, it looks like my original video settings we mangled on the SD card that shipped with the Pi Zero W. My latest attempt work - and Pacman is playable with latest advMame - but asteroid is not. That said, Super Mario works like a charm...
    Now I need to discover how to tune the Pi Zero.
    And my Orange Pi arrived...
  • Saturday, 25 February 2017

    PiPlay struggles.

    The PiPlay interface randomly hangs. Fortunately the web interface allows a reboot.

    Setting up a joystick is not intuitive. You need to install the jstest and set the codes in a variety of config files. As far as I can tell, the controller config python script does not work.

    For SNES, go to the emulators directory and find the snes9x.cfg file. Update the mappings in there (after you've installed and run jstest to figure out what the buttons are.)

    For NES, you need to jump through a few hoops. First, "startx" from CLI. Then, find the fceux directory (in the pimame emulators directory). Start a terminal in X. Run the fceux --inputcfg gamepad1 command and set up the buttons.

    For advmame, find the default.cfg and add your joystick settings. You can get a hint what they should be via tab in the emulator.

    I finally got sound working on astroblaster and starcastle. The trick is to find the sound samples with the same name as the roms and install it in the sample directory. You can find this in the .advance directory (hidden) in the ~pi directory (that is home). I haven't tried donkey kong yet, but if that works, I'm in heaven.

    Sunday, 19 February 2017

    PiPlay on Raspberry Pi 2

    Yes, I finally got around to it. I installed MAME on my Pi 2. After trying to install it on my existing SD card, I figured I'd just use a pre-existing image. win32diskimager is the tool to backup your old images and image and make new ones. Pick either of these two images.

    Add DHCP to the wireless network adapter. Go to raspi-config (tools) and resize the partition to use all 8G. Reboot the thing and install the latest MAME via its home screen. Reboot again. HTTP into the Pi and use the PiPlay upload for ROMs. Have tons of fun.
    br> Here is my gear.

    Tuesday, 22 November 2016

    How to Fix Moto G MTP not working on Windows 10


    After spending two hours and a long uncomfortable call with Motorola that went nowhere, I finally managed to get MTP working on my new Moto G 4 phone.

    Effectively, when I set the phone to MTP mode, the driver failed to load. I could run as PTP, but that didn't give me access to the whole FS...

    Device manager told me that the install was incomplete due to a bad inf,

    "a service installation section in this INF is invalid"

    The advice on the internet was 
    • update the driver
    • reinstall the driver
    • turn it off and on again

    and a variety of other shamanistic advice, none of which work.

    Motorola's advice was to run their Device Manager to reinstall the drivers, but of course, that tool didn't recognize the device being there so... and then the advice was to call Microsoft support.  Sigh.

    I found the solution myself. For whatever reason, the PNP tools were not actually getting to install the right INF, even when I selected it via "legacy hardware", likely because some other config was getting hit first.

    If you have the same issue, simply do this.
    • Run an administrator cmd shell
    • cd to \windows\inf
    C:\Windows\INF>pnputil /?
    Microsoft PnP Utility

    PNPUTIL [/add-driver <...> | /delete-driver <...> |
             /export-driver <...> | /enum-drivers | /?]


      /add-driver <filename.inf | *.inf> [/subdirs] [/install]

        Add driver package(s) into the driver store.
          /subdirs - traverse sub directories for driver packages.
          /install - install/update drivers on any matching devices.

      /delete-driver <oem#.inf> [/force]

        Delete driver package from the driver store.
          /force - delete driver package even when it is in use by devices.

      /export-driver <oem#.inf | *> <target directory>

        Export driver package(s) from the driver store into a target directory.


        Enumerate all 3rd party driver packages in the driver store.


        Show this usage screen.

    Legacy Commands:

      [-i] -a <filename.inf> ==> /add-driver <filename.inf> [/install]
      [-f] -d <oem#.inf>     ==> /delete-driver <oem#.inf> [/force]
      -e                     ==> /enum-drivers


      pnputil /add-driver x:\driver.inf       <- Add driver package
      pnputil /add-driver c:\oem\*.inf        <- Add multiple driver packages
      pnputil /add-driver device.inf /install <- Add and install driver package
      pnputil /enum-drivers                   <- Enumerate OEM driver packages
      pnputil /delete-driver oem0.inf         <- Delete driver package
      pnputil /delete-driver oem1.inf /force  <- Force delete driver package
      pnputil /export-driver oem6.inf .       <- Export driver package
      pnputil /export-driver * c:\backup      <- Export all driver packages

    C:\Windows\INF>pnputil /add-driver wpdmtp.inf /install
    Microsoft PnP Utility

    Adding driver package:  wpdmtp.inf
    Driver package added successfully.
    Published Name:         wpdmtp.inf
    Driver package matches devices that already have their drivers up to date.

    Total driver packages:  1
    Added driver packages:  0


    Tuesday, 13 September 2016

    Geek Dad: Teaching the boy to code...

    I might have finally gotten my sons attention.  I've been trying to teach him to code in Java for a couple years, but I am competing with the instant gratification of Scratch.

    First attempt went something like this: "Hey dude, look how you can use state machines and state transition diagrams to write a text adventure like Zork!" He was kind of interested in building the map, but I lost him in implementing an actual game complete with inventory and actions.

    Next attempt was: "Hey son, remember Wizard's Quest the board game I showed you? We can write that as multiplayer network game (kind of like Dark Forest when I was a kid)." He learned something about polygons and translation from the game board into the computer, but I lost him in implementing the event loop and game rules.

    Finally we have: "Dude, when I was 8, I played this game called Chase on a Data General Nova III, and it was cool because like in Tron, you could maneuver the robots chasing you into the walls and escape the grid!" I think I got him this time, because I was able to spin up a framework in a few hours, and the building blocks are all there for adding animation, time/event based movement, and other elements.  Almost instant gratification in a couple pages of code.

    The Grid

    The rules.  You are in an arena with electric fences and robots. The robots can only move horizontally or vertically, but you can move diagonally. The objective is to run away from the robots and attempt to maneuver them into the walls.  You win when all the robots are dead. You loose when you run into a wall, a robot gets you, or you exceed 100 moves.

    Robots use the difference between their position and your position when deciding to move vertically or horizontally (50-50). If another robot is in the way, they pick a random direction (that can cause them to bump into another robot or wall). Whatever a robot runs into is destroyed, but when one robot hits another, one survives.

    The Tron Maneuver

    Friday, 22 April 2016

    I Turned my Pi into an Echo (not quite)

    Being sick with a head cold, I took a few hours to play with the Pi and do something Alexa like.  I've been trying to get an Alexa project in - but time isn't my friend at this time.


    Installing everything I needed on the Pi took a couple hours.  It, for the most part, went without a hitch.  However, there are some things that irritate me.

    The instruction on getting tightvncserver persisted doesn't work for me.  For whatever reason, I need to start it each time I boot my Pi, (and also I did not set the maven environment variables in a startup script, so I need to do this every time I make a shell).

    The java installer script is broken.  lsb was not installed on my Pi.  I went to get it, and then though it is Wheezy, the version code wrong.  So - comment out the first few lines to check the version and I updated Java okay.

    The AYL speaker I bought makes a TON of noise when the USB power is plugged into the Pi.  I figure its drawing too much amperage given the connection I had to the USB on the computer I use.  I didn't retry it on a wall charger.

    Even though I said yes to Amazon Music, I gather their is a permission step from Amazon they might not be willing to grant for hackers such as myself - even though I have Prime and active Amazon Music subscription!  Grrr.

    But at least now I have a base to play with.  The companion server (node js) and the sample java client both work as documented.  Note, you do not need a wake word, just give the command once you click the start button.

    Saturday, 11 July 2015

    What do you do when...

    Today's blog is about image processing.  In some down time, I've been trying to figure out what to do to manage my photo library that has grown over 25G.  This makes it hard to just upload to the cloud (free services anyway).  My first intention was to remove duplicates.  But of course, its more fun to tackle the bigger issue.  How can I index my library so I can actually query against it?

    My first thoughts were; there needs to be a simple way to do some basic image comparisons, so what are they?
    1) produce a grayscale histogram
    2) produce a color histogram
    3) create a CRC
    4) gather meta data

    If an image is exactly the same, regardless of file name and whatnot that can change if the image is copied, then the CRC (ie Adler) will be the same.  The trick is, don't calculate the CRC on the file, but rather the contained image, because if the image is edited or saved (i.e. a copy paste), then the EXIF metadata will get lost.  So, trick one, calculate the CRC on the pixel map and at the same time rip out the EXIF metadata to stuff into an XML metadata file.  (Cool right?  Too bad java libraries do not include mechanisms to extract EXIF from JPEG!  But easy enough to borrow some libraries from open source projects.)

    While calculating the CRC, that will tell you if the image is exactly the same, you still have the issue of "What if I rotated the image 90 or 180 degrees?"  You will have a different CRC, so that mechanism won't help.  But you can create a histogram on the image.  Then you can compare histograms, and if the image is rotated so it is edge aligned (270,180,90) or bit flipped, if those histograms are equal, the image is the same with high probability.  Also, images of the same subject in the same context (background) will also be similar.

    So, if you have free rotate or scaled (or otherwise changed the image quality or cropped), the histogram might be a good starting guess.  There will be false positives, but from a numerical standpoint, you can then move on to more intensive methods.  How to compare?  Cosine similarity works.  The vector is the histogram, and you can fix the scaling issue by changing the frequency (count) of the color to the percentage (so count over total size).  I have a sneaky suspicion this is how the brain does it.  When our eyes scan an image, we look for discontinuity in the image (and tend to ignore anything with continuity.  That's why "if it were any closer it would bite me.")

    I am still thinking about false positives, or how to identify subjects in an image.  For subjects, the cosine similarity will also work, but figuring out the threshold of what to suggest to a human could be fun.  I need to play with that, but I figure a that with a divide and conquer based on histogram might work. Then also working in some extrapolation methods.  I could divide and conquer to generate average colors in a section of an image, and/or use that to generate a polynomial for horizontal and vertical slices.  If the coefficients are close, then there is a good bet the images are similar.