Sonntag, 31. Dezember 2017

windows 10 + Reprap NEO + USB Serial

This is more a note for myself when I have to install the printer again, than a blog post :-)

I have got a used Reprap NEO which I had to repair. After doing the hardware stuff I had problems installing the printer on my Win10 machine. A "USB Serial" device was recognized in the device manager, but no driver was installed and I couldn't find any info about the chipset on the manufacturer's website. (To be honest I was too lazy to open the device's case again :-) )

On my other laptop the printer worked immediatly, so I installed the same driver on my first machine.

This is my web search:
https://duckduckgo.com/?q=usb+serial+pjrc.com&t=ffsb&ia=web

On this page I found the driver:
https://www.pjrc.com/teensy/usb_serial.html

The printer is the device on COM4:




Freitag, 13. Januar 2017

Repairing an Epson HX-20

Today I could complete the restoration of an Epson HX-20 I have got some weeks ago on willhaben.at for free.
The first inspection resulted in some damaged capacitors and a missing battery pack. This ended in strange behavior because the device doesn't work correctly if the internal battery is missing, even if it is connected to an external power supply.
There is one interesting point, that could be helpful to others too. Some parts of the memory is always turned on to keep time and stored programs. Sometimes this memory gets confused and needs to be reset. This happened if you see strange characters after turning it on, or you don't get to basic from the start up menu. Firstly I thought one of the ram chips is damaged. Normally this reset is done by pressing CRTL+@. My device has got a germen keyboard layout and there is no @ sign. On my device I had to press CRTL+§ (Control+shift+3)

p.s.: Like on many other 8-Bitters from the 80s like the C64 and C128, the basic is  from Microsoft :-)


Samstag, 17. September 2016

Mendelbrot

Flash player is requires for this post!
Back in 2009 I had a blog about flash game development. After taking it offline I've got some requests to put some content back online. Today I found a backup of the blog and some posts still seem to be interessting to me. So I'll repost some of them here. This is one of them.


This is no informative post, but I like mandelbrot :-)



plasma

Flash player is requires for this post!
Back in 2009 I had a blog about flash game development. After taking it offline I've got some requests to put some content back online. Today I found a backup of the blog and some posts still seem to be interessting to me. So I'll repost some of them here. This is one of them.


You can reload the page to see different effects.

Some weeks ago I needed some eye candy for my latest game. The easiest way was to put some plasma in the background. But mostly plasma algorithms generate a repetitive pattern and i wanted a better one.

I found this post in david's blog: http://www.gibbongames.com/?p=167

Unfortunatley this program is written in blitzmax, a language I don't know at all. But the syntax is easy to understand, so it took just some hours to port it.
I have added one nice feature. You can define how many lines are calculated by render circle. So you can screw down the fps of the plasma effect and use the CPU for what you really want to do.

p.s.: My favourite line of code in this project is

if ( ubyte[plasma_id] & 128 )
                            ubyte[plasma_id] =  (~ubyte[plasma_id])&0x7F;

It's a very good example of the power of bit operation.

The flash version is from 2010.
In the meanwhile I wrote a javascript version too:
(Drag the mouse to animate and rotate color.)
Interactive Plasma written in java script.

rendering ISO-tiles with blender

Back in 2009 I had a blog about flash game development. After taking it offline I've got some requests to put some content back online. Today I found a backup of the blog and some posts still seem to be interessting to me. So I'll repost some of them here. This is one of them.

For a project I am planning I want to render iso tiles with blender. After some research with google and in some blender forums, I just found no satisfying solutions. So I had to build up something myself. First let's consider the situation in an iso game to get some cornerstones for our system to work efficiently.

1. Buildings and landscape tiles need to be rendered from four directions.
2. Creatures need to be rendered from four or eight directions depending on the game design.

This leads to a render scene with eight cameras.

3. We need a system to synchronize all properties, positions and angles of all cameras. This makes the perspective of an object stays the same if we use the images of a different camera in the game.

That leads to a system where:
- all eight cameras are looking exactly at the same point.
- all eight cameras are at the same distance of the focus point. So, their positions are building a circle around the the focus point with an angle of 45 degrees between each camera.
- all eight cameras have exactly the same properties, like focal distance, ...

I am not an expert in blender, so it took me some hours to build up a system providing all that points.

How does it work:

1. I created an empty at {0,0,0} and named it "camTarget". This is the focus point.
2. I created a circle at {0,0,10} and named it "camCircle.001".
3. I created a camera and named it "cam.001". To this camera I added two constraints.
   a) a FollowPath to "camCircle.001".
   b) a TrackTo to camTarget.

4. I repeated these steps eight times, where I duplicated the camera with ALT+D to secure all cameras will have the same properties.
5. Each camCircle is rotated +45 degrees.

6. I added an empty and named it "camRing" all camCircles are child object of this empty.
7. I added an empty and named it "camAll" camRing and camTarget are child objects of this empty.

8. I locked some properties to allow the three empty just to move along the z axis.

That's it.

To change the perspective you can drag camTarget and camRing. To lift the whole system without changing the perspective you can drag camAll.


Downloads:

Blitting - The art of fast Pixel drawing

Back in 2009 I had a blog about flash game development. After taking it offline I've got some requests to put some content back online. Today I found a backup of the blog and some posts still seem to be interessting to me. So I'll repost some of them here. This is one of them.

To display objects on screen in flash games Movieclips or Sprites are used very often. Sure this is the easiest way to handle it and if there are not much objects this is OK. But when performance comes in play there is a much better way to display objects - blitting. Blitting reduces the overhead of managing display objects in the flash player and allows you to use the saved CPU power to display more objects or to use it where you really need it.

Blitting

Blitting stands for BLock Image Transfer and describes a technique of drawing pixels on screen. The idea is quite simple. Instead of creating tons of MovieClips we create one Bitmap and paint all objects on it. So the flash player has just to manage one object. With flash 8 (I think) the BitmapData object was introduced. This object allows direct access of pixel data in images. And this is what we are going to do.

For this I'll write the same application one version with MovieClips and a second version with blitting. The application will be very simple. It will create moving objects on screen and as long as a certain FPS count isn't reached flash will add one object. If the FPS count falls to much one object will be removed automatically.

The average number of objects on screen will indicate which version runs at a better performance.

I'll not describe how to create MovieClips, but I'll explain how blitting is done.

First we need the BitmapData object. The BitmapData object represents the content of a Bitmap object. It gives us direct access on pixel basis. Additionally we need a Bitmap object. This object represents the display object we can add to stage, we also link our bitmapData object to it. This is the way our pixels comes on screen.

======================== AS3-Source code:begin
...
import flash.display.BitmapData;
import flash.display.Bitmap;
...
var screenData:BitmapData = new BitmapData(640,480,true,0x00000);
var screen:Bitmap = new Bitmap(screenData);
addChild(screen);
...
======================== AS3-Source code:end

The BitmapData object offers different ways to manipulate its pixel content. The fastest was to bring something to it is the function copyPixels. With this functions we can transfer pixel data from one BitmapData object to another one. We also can determine the position where pixels will appear. For this we need an additional BitmapData object holding the data we want to show on screen. To do this we are simply drawing a MovieClip on it.

======================== AS3-Source code:begin
...
import flash.display.MovieClip;
...
var mc:MovieClip = new Unit(); // Unit is the MovieClip in the Library
var objectData:BitmapData = new Bitmapdata(42,42,true,0x000000);
objectData.draw(mc)// this draws mc to objectData
...
======================== AS3-Source code:end
Technically this is all we need to do.
X and Y describes the point where objectData is drawn in screenData.

For more information about BitmapData object follow this link:
http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/display/BitmapData.html

 demofile using MovieClips: Demo with Movieclip
 demofile using blitting: Demo with blitting
 Here you can download the source of the demo files: Source code for demo files

Donnerstag, 2. Juni 2016

The second life of a Casio DH-100

More than a year ago I have got a casio DH-100 on Ebay. Unfortunately it was totally disappointing after getting it.

  • Soldering joints were made unprofessionally.
  • The cover of the battery slot was missing.
  • Flex cables had to be replaced.
  • And the worst thing was, someone has removed the pressure sensor.

Technically the description on ebay was correct, saying "it's just working with breath mode turned off". But I am sure the seller wanted to make buyers believe it's just a small problem that's fixed by replacing a capacitor. However, after some emails I have got the cover for the battery slot.

In the next step I did some general clean up of bad soldering like this one and replacing a flex cable with the cable of a floppy disc drive.


I shorted the legs as much as I could and fixed some dry soldering joints.

The Pressure sonsor

Now there was the biggest problem left, the missing pressure sensor. I found a technical manual that explains the sensor quite well. It's a moving iron core in a coil but it doesn't say anything about the number of loops, length or diameter of the coil or the core. The breath is moving the core which is changing the inpedance of the coil. This change is converted into an analog signal for the CPU.

I tried to contact some service center for those devices to get photos or any information they can provide but I didn't get anything. For the next year the casio was laying around and nothing happened.

Last week I felt it was time for a plan b. I thought I could start playing round with some coils, but this seemed very unprofessional to me and didn't look very promising. So I checked my bench for helping stuff and found a picaxe m20 and a mpx5010. I knew the impedance of the coil is converted into a directed current and the CPU is reading it with an ADC. So my plan was to use the pressure sensor and the picaxe to simulate this analog signal. Of course the m20 didn't have an DAC to create the analog signal. But I remembered an old friend of mine. He created an DAC on the LPT-Port of his 386. This was in the in the early 90s, where sound cards were not the standard. There goes a waving hand to albert for showing off ;-) On Google I found the covox speech thing. The m20 offered enough output pins to build an 8 bit DAC and so I had everything what I needed. Find the schematic at the end of the post.

sensor electronic for EWI


Writing the software took 2 days. It was my first picaxe project and for this I had to learn how to code it. The tricky part was to scale the air pressure to values that are understood by the original CPU.

There are some points to be considered:

  1. The sensor has a pressure range from 0 to 10 kpa.
  2. The actual pressure in the instrument never goes that high. I guess it ends at 3-4 kpa. The instrument isn't a closed chamber, the player is blowing thru it. So there is just a small rise in pressure inside the air channel.
  3. The ADC of the original CPU takes 0 to 5 volts.
  4. The Software in the original CPU just processes values from about 0.5 volts to 1.5 volts.

Sheme of pressure conversion for orig. CPU

On the output side of my module there are two key parameters. The minimum and the maximum output level. The more critical one is the minimum level. If it is too high the horn blows constantly. To be able to adjust this value I added two keys to increase or decrease it. The maximum output level is hard coded and has to be adjusted in the source code(config file). The next key parameter is the relation between the max output level and the max input level. This relation is auto adjusting. The software takes the maximum measured input pressure for the maximum possible value. That means after turning the device on it has to be blown once to adjust your pressure sensor. On the other hand if it is blown too hard the full volume is hardly reached in normal play. So there needs to be a way to reset the auto adjusting mechanism. This is done by pressing both buttons at the same time. To distinguish no breath and normal air pressure there is a minimum sensor pressure that has to be reached to generate any output, otherwise the horn would blow because normal air pressure pushes the sensor.

These are all config values for the software:
  • minimum output level
  • maximum output level
  • minimum sensor data

Connecing the main board

The main board is connected at 3 points. On one hand to get VCC and GRND. On the other hand to feed the original CPU with the pressure signal.

connection points to the main board
analog input pins on the original cpu
The analog signal from the sensor goes to 2 analog input pins of the original CPU. First I disconnected them from the main board(I am not sure if this is necassary) and connected both to the output pin of my DAC.

That's it - on the bread board it was working like a charm!


The last task was to put everything back into the case.
Luckily there is enough space in the case

In the case of the instrument there is enough space to add the pressure sensor and the chip.
The pressure sensor sits next to the speaker
The board sits next to the main board

Userinterface

Userinterface of the device

To the user panel I added two buttons and a 3-Pin-Connector to be able to upload a new firmware to my picaxe.

Schematics

Please excuse the quality, I had to draw it with Illustrator :-)

For the DAC I used 10 and 20 KOhm resistors
The capacitor has 100 microFarad
SIN = serial in
SOUT = serial out
The MPX5010 is not connected directly. There are some elements used. Please see the manual of your exact chip. On google I found projects connecting them directly, but the manual shows a very small circuit that is recomended.

I made one Failure in this project

I connected the resistors in the wrong order to the output pins of the m20. For this I had to add an option to reverse the bit order of the output data. The schematics below shows my wrong version.

Finally, it's working

Here you can see the output signal on the oscilloscope

Final thoughts

I designed everything to be independent from the casio device. So I made a general module that could be interesting for other projects too.
The original device is working with moving mass. This replacement is working with a pressure sensitive chip. I can't compare them, but I guess the replacement is reacting faster and better to pressure changes.
Firstly using the picaxe looked a bit over engineered to me, but there are some parameters to adjust. And doing this in software is much easier than in analog circuits.
Having the picaxe and the software opens a door to effects that can be build into it.

Success

Finally,  yes my casio DH-100 is now working again and now it's time to learn to play it :-)



Downloads:
PICEWI on GitHub

PROJECT UPDATE 2016-08-27 - Picaxe - Floating serial in

In this project i had serial in of the picaxe floating. This made it stop working randomly.
Please check page 31 of the picaxe-PDF get serial in grounded.
http://www.picaxe.com/docs/picaxe_manual1.pdf

Update 2017-07-22 original pressure sensor

I have got a second DH-100 on ebay for some bugs. It just had a death capacitor, so rapairing it was a question of minutes :-) Now I can compare the original sensor to my own build. I tried both and I can say my rebuild with a modern sensor is much more sensitive and easier to play.