Fighting with computers

Computers are not always friendly.

Friday, October 10, 2014

VFD control with Arduino using RS485 link

Variable Frequency Drives (VFD) allow the control of spindles so speed can accurately be controlled and a detailed acceleration profile for the spindle and reverse rotation can all be handled. In essence a VFD is an three phase inverter for three-phase AC motor.

I am using a popular (I mean cheap) Chinese VFD and though the reference manual is not great, I could see there is a built-in RS-485 port. I usually control the start, stop and speed selection using the keyboard on the unit but I thought it will be more useful if I could control everything from the same Arduino is doing our CNC table control.

Some cheap RS-485 off eBay and some lines of code later, I can start, stop and change the speed from an Arduino. What a cool thing to have!




Some configuration of your VFD are needed before you can use it like that.  You need to set PD163=1 (I am using address 1 in the code). PD=164=1 (for setting serial to 9600bps) and PD165=0 (for using ASCII and 8N1 character format). On top of that, you need to set PD001=2 (for commands being provided through the communications port). 

Please note that doing that may interfere with your existing controls using external terminals, so be careful as that might make your emergency or external stop buttons to stop working. The built-in stop button still will stop the spindle but you need to power-cycle the VFD for accepting new start commands over the serial port.


Thursday, October 09, 2014

First steps with ESP8266 wifi module

Some weeks ago it was mentioned in hackaday.com a new wifi module was available at a very tempting price (I paid $10 for two ESP8266 units shipped). It is a full SoC system which firmware can be updated.

My main interest was to use it with Arduino projects and, perhaps, as a way to use my 3D printers wirelessly.

The module offers, among other choices (I2C, SPI) a serial connection, running at 115200bps. Getting it to work has been a bit weird, as documentation was not very accurate and I was not paying much attention either.

Care has to be taken with power supply as the unit is to be powered at 3.3V and using 5V will probably kill it. Likely it seems that I/O are 5V-tolerant (or so they seem till now).

My initial setup has been to use an Arduino UNO as a power supply for the 3.3V and another 3V USB to Serial adapter with one FTDI chip. This way I was able to interact with the board using a serial terminal software (Coolterm). Unfortunately my initial setup was a no go.

I initially connected GND, 3V3, TX and RX pins. I was lucky a friend of mine did the same dance before and figured out that at least an additional pin needs to be HIGH too, which is CH_PD pin that acts as an enable signal, without it the board is mute and deaf.

Once you connect this last pin to VCC (remember 3.3V) the module is brought to life, and after some garbage in the serial port you can read the word "ready". Once you get there things will start to get interesting.

I have found the best was to interact with the module is using an Arduino with at least two serial ports. Whether you use a Leonardo or a Mega, you can get an extra hardware port to communicate with the module and the other for interacting with the user via the serial terminal.

You can do the basic stuff if you load the Blink example on your Arduino UNO (so you are positive Arduino serial port is not used) and you connect the TX and RX pins of the module to pins 1 and 0 of Arduino. But this setup is only for you to use Arduino's IDE Serial Terminal function.

If you want to start coding for Arduino to do some useful stuff you need to be able to both reprogram the Arduino (which you cannot with the previous setup) plus accesss to or being accessed from the Internet, a second serial port is needed. One that can work at 115200bps. Unfortunately SoftwareSerial can only work up to 19200bps, so it is out of the question.

The picture above shows how I am using Serial3 on Arduino Mega as the communication channel with the module, while Serial is kept for the user interface (with the serial monitor of Arduino IDE).

I have created a simple bridging code between the two ports as you can see below:

// simple terminal on Serial3 <--> Serial for Arduino Mega 
void setup() { Serial3.begin(115200); Serial.begin(115200); } 

// copy from and to each port 
void loop() { 
 while(Serial3.available()) Serial.write(Serial3.read()); 
 while(Serial.available()) Serial3.write(Serial.read()); 
}

Now open the Serial Monitor and start testing the different commands. Try first just "AT" to see if you get an "OK" response. If you don't, they there is some connection problem (maybe TX and RX pins are connected the other way around?).


Basic commands

Once you get your module to answer your commands, you may want to try AT+GMR to check which version is your firmware. Mine is 00160901. 

You can reset the board with AT+RST command.

But the magic starts once you try AT+CWLAP command, that will provide you a list of available wifi access points in the area.

Next you want the board to join a certain access point (most of us want the board to act as a STA or wifi client that will connect to an access point). That behavior is selected with the AT+CWMODE=1. You will need to reset your board after making this selection.

To connect to your home/office access point you issue the command AT+CWJAP="yourSSID","yourWifiPassword"

The good news is that from now, every time you power the board it will try to connect to the same wifi network. You can see if it was successful by checking your router's DHCP client list. Alternatively you can check your module IP address with command AT+CIFSR. Once you know your board's IP address you can try pinging it from your computer. Do not be surprised if you get delays over 100ms sometimes. 

If have made it so far, then your are ready for some fun uses.

TCP client and server modes

The module can handle up to four connections at a time. The card can be set to allow connections with the command AT+CIPMUX=1

A TCP connection can be started, for example to a web server by AT+CIPSTART=0,"TCP","www.yourwebsite.com",80

Once you get the OK response, you should get the text "Linked" next showing you the connection has been established. 

Now it is when things get a bit odd. Whatever you send to the serial connection of the module IS NOT transmitted through this new connection but just interpreted as new commands by the module board. If you want to transmit something you need to use the command AT+CIPSEND=0,50 to send in this example 50 bytes (change the number by one of your choice). After this command you get a prompt ">" so you can type your 50 character that will be transmitted through the TCP connection you just created.

If at any time data is received through any open connection, it will be signaled by a line of text over the serial interface "+IPD,0,1024:....". Number 0 is the identifier of the connection data is coming from. 1024 is the number of bytes that come afterward, not including the colon that acts as a marker. Next all the 1024 bytes will appear over the serial line.

If you receive several TCP segments, each one of the them will be signaled as the one above, stating the correct number of bytes of each one.

The TCP connection is meanwhile kept open. If you want to close it at any time, use the command AT+CIPCLOSE=0 (0 is the connection id number, that may change in your case). No matter who closes the connection, once the connection is closed you will get a line with the message "Unlink" warning you about a connection being closed. 

You can check the status of your connections with command AT+CIPSTATUS

The board can also enable a local TCP server with command AT+CIPSERVER=0,8888 (where 0 is the connection id and 8888 is the port number). Once created, you can connect from your computer using telnet or netcat to your board's port 8888. Again any data the board receives from the connection will be announced with the +IPD,0,bytes header. And you can send data to the client with AT+CIPSEND command as you did when using the TCP client connection.

Contrary to the documentation, I could not make any connection if AT+CIPMUX=0. That is supposed to allow only one connection but it did allow any in my case.

Multiple connections to the TCP server are possible (I guess up to four, but I have not tested it). 

Power supply issues

Sometimes I have got the board die on me with a message that suggested a watchdog timer reseted the board due to a malfunction. This seemed to happen a lot while using the board at the office (clone computer) but it did stop happening when trying the board at home with an old-ish iMac. My guess is that the Arduino UNO and or my office's computer USB max current was quite close the peak current needed by the board. However, with the Mega connected to the iMac I have not seed the message all evening. 

To be on the safe side, get yourself a 3.3volt power supply that can provide up to 400mA and you will be ok. Along the ride, there have been moments when the board did not answer me right away for reasons unknown, for example not responding for a while to AT+CWLAP command (for listing access points). 

I know there are more modern versions of the firmware and the newer ones do include a way for the board to self upgrade once it get online (cloud upgrade) which is kind of cool. Once I learn whether it is worth or not I might upgrade.

Not exactly what I expected

Unfortunately, using the board with a 3D printer running Marlin software on an Arduino Mega will require some filtering of the data sent back an forth. As received data is prepended by the text "+IPD,id,bytes:" and in order to send data you have to invoke command "AT+CIPSEND=..". All this makes the communication not very transparent, at least not as transparent as when you use a Bluetooth module. But it is still doable with some coding.

Finally, what I did not like either is the link throughput that was below 80kbps in my tests, where the module is not in the same room as the wifi router. 

However, for data logging on the cloud or IoT projects based on Arduino I think this board is a great tool as it allows IoT integration at a very affordable price.  





Thursday, September 25, 2014

The ever shrinking Arduino

The las version of Arduino I bought is the micro. Around the size of the Arduino Pro Mini but
featuring a processor that handles the USB port too and costing $7.50. As I bought mine from an Asian online seller off eBay I decided to give a try before providing feedback.

Last week I have got trouble with two items I bought on Aliexpress: a set of Kossel linear rails that have rough spots along the rail and a set of hardened chromed smooth rods that are very smooth but bent too. In both cases they first impression was they were ok and I give them the heads up so they could get my money. Unfortunately, on closer inspection I discovered the problems mentioned above and I am still in the process of sorting it out with the sellers.

This time I wanted to be quite sure everything worked as expected ... but it did not. I could happily upload new sketches once I selected the Arduino Micro as the target board. But I could not get Blink program to work. After checking Arduino docs about the Micro it was clear pin 13 was actually the LED pin on it. But I had not one but two leds staying on all the time (besides the power pin).

A closer inspection revealed my unit was another variant called Pro Micro. It turned out this board does not have the led at pin 13. The two leds availables are somehow weird, as one of them is connected to RX_PIN that happens to be pin number 17 but the other led is connected to TX_PIN which, oddly enough, is not associated with a pin number, but two macros: TXLED1; will set it off and TXLED0; will turn that led on.

You can get the Blink program for that board from Sparkfun. And a micro USB cable is needed (similar to the one most Android smartphones phones use).

I am happy to report that at least this device works ok :-)

Thursday, September 04, 2014

Stupidity-R-US

Today, after a long wait, I made my mind to shopping for a brand-new MacBook Air. I went to the Apple store in my city before the summer but I did not like what I was told: They will make me a nice discount for being a university professor but only if I was billed personally. I wanted the machine to be invoiced to my university that would slash the discount seriously. It did not matter that my university was a leading public university in the country. I left the shop shocked and empty handed.

After checking with some colleagues it seems that is Apple's usual policy, though nobody was able to explain why. Anyway, after doing some taxes math I saw it was still more convenient for me to charge the bill to my personal expenses account I hold with my employer so I went for it.

These is more or less my experience today at the Apple Store in Valencia.

Apple rep1 (at the door): How can we help you today Sir?
Me: I would like to buy a MacBook Air.
Apple rep1: Do you have it reserved?
Me: No, I don't. But I do know the model I want. Do you mean I need to make a reservation for a unit?
Apple rep1: No Sir. I did not say you need to book a unit in advance.
Me: I just heard you asking me if I have it reserved ... (odd awkward moment)

Apple rep1: Please come with me so my colleague will handle your order. (We are guided to the MacBook Pro 15" area and we are told to wait there for the representative that will help us next, and so we do).

Apple rep2: (After asking as our names) What can I do for you?
Me: I want to bay an i7 MacBook Air with 8GB of RAM and 512 GB of storage. I want the order to be invoiced to my [employer who is a local] university.
Apple rep2: We'll let me check if we can do that, as the university counter should come here for such an order with the tax number.
(After a while he is back and confirms we can proceed) But now the discount will be much lower than if you were buying the unit personally.
Me: I acknowledge that but insist I want the invoice to be to the name of my university:
Apple rep2: Unfortunately my colleagues that handle business accounts are already off and I am afraid I won't be able to get your university taxes number. Do you have it by any chance?
Me: Of course I have it, it is ******.
Apple rep2: Ah, ok then. Please give company name and address. Would you pay credit card or cash?
Me: I would pay credit card.
Apple rep2: Ok, hold down and I'll be right back.
... one minute or two later ...
Apple rep3: Congratulations on your new MacBook Air. Now my colleague will proceed with the billing.
(Some conversation about the university takes place now, as Apple rep2 is a graduate from my university but I do not think that is relevant to this post).
Apple rep3: These are the details of the transaction (and repeats all my company data). Is that ok?
(he has been frantically using the inch-thick iphone-based device they use as a terminal for a while and eventually produces a ticket which hands over to me).
Me: What is the invoice number? (nothing like invoice number text appears on the ticket).
Apple rep2: (pointing at a barcode) That is it.
Me: Ok thank you very much.
Apple rep2: Would you like to configure your new laptop in the shop?
Me: No, thanks, I will do that at home.
We both say good-bye and I leave the shop with my laptop in a bag.

I really did not like the feeling in the shop. It felt like unless you make clear you know nothing about computers and they do not know how to handle you. I do own several Apple computers I have bought over the years though I am not an Apple fanboy. I think next time I am buying an Apple computer I will buy it online as half of my interactions with the shop representatives were kind of telling me that buying might not be possible at all. I am not asking for pushy salesman but a bit of a profesional salesman would help, even if they are not in their twenties but know the ropes.

As for the Air, what can I say? It is a light but powerful beautiful machine.

Friday, August 15, 2014

Reading binary STL files in Java

I liked the source code from MaskedRetriever user on github and I assumed it would work ok. It seems it was an attempt to create a self-contained tool for 3D printing but somehow it was left at an early stage. But I liked the fact that source code was documented.

My needs were to read STL files and to slice them. As usual you need to get familiar with the different classes involved but it took me not much to get it going. I stripped most of the classes as I was not interested on 3D printing nor on having a GUI for such a tool. However, as soon as I draw the output of the slice process I noticed something was wrong.

While the proper slice looked smooth like the image below:

What I was obtaining was a bit of a mess, though the general ideal was correct. As it was my first attempt I was not sure where the error might be.
After a few tests I realized that the same code would work ok if STL file was ASCII-based but it will fail as above if a binary STL was used instead. 

I had a look at the code and I could see reading a binary STL file involved obtaining float values out of 32-bit IEEE 754 encoded values on the file. It seemed it was there when error was made in the conversion.

Googling around I realized there was a library function in Float class called intBitsToFloat that will turn the 32 bit number into the proper float value. I only needed to get that 32 bit number out of the four bytes read from the file, easy peasy ... or not?

Well, if that were C, and you have b[0..3] unsigned chars, the expression could be something like 
 b[3]<<24 | b[2]<<16 | b[1]<<8 | b[0]  

However Java language considers byte data-type as a signed 8-bit field (-128 to 127). And there is a nasty effect with the sign extension that may make you waste a fair amount of time. In summary, the C version won't work if negative values are involved, and they are most of the time (half of the time I would say). So one way of obtaining the proper 32 bit number in Java would be a bit longer : 

 (b[3]<<24)&0xff000000 | (b[2]<<16)&0xff0000 | (b[1]<<8)&0xff00 | b[0]&0xff  

Tuesday, August 05, 2014

More on delta 3D printers

It's been quite busy around here lately. Still, I have managed to build a couple of delta 3D printers with heated beds and develop a couple of ideas that seemed worth trying.

One of these ideas is the use of a heated bed. While I can see that some people are moving away from ABS to use just PLA plastic, I do not see how I can use a PLA-only solutions for environments where temperature can be high, like inside of a car or near a hotend or heated bed.



Two different types of extrusions and carriages were tested: wheeled carriages over the extrusion resulted in a quieter and more accurate system than rails. But the IGUS guides used had quite play by design. After watching the videos of them working I am not sure they are a good choice for this particular use, though printed parts do not look bad after all.


While Johan pioneered the use of force sensing resistors on the bed for probe-less bed detection, I was not pleased with the additional cost these FSR sensors would add, so I turned to the same idea Brook did with the metal Printrbot Simple: the use of inductive proximity detectors (as I am using aluminum heated beds). As I wanted to add the sensor to the effector and to use magnetic couplings instead of Traxxas ball joints, I designed a few new parts.

I am very happy with these plastic parts for creating a Kossel Mini using 2020 extrusions. And the guys from Mecaduino provided me a set of parts for making a Kossel Mini using their metal parts (however I did print some plastic parts to use magnetic coupling and inductive proximity probe with it too.

With the magnetic couplings, with I liked more than ball joints, as they have zero slop, if you set the acceleration too high (in my case higher than 1500mm/s^2) the rods will fall apart on any fast movement, that will never happen with a ball joint. I am using 10mm steel balls and 6mm-diameter 8mm-long N35 magnets. I guess stronger magnets will allow you higher effective accelerations.

The second innovation I have been testing is the auto-calibration firmware I mentioned in a previous post by Rich Catell. While the first time I used in a 3DR printer with a mechanical switch the firmware converged quickly, these two other printers gave me hell and did not converge to a valid calibration all the time. Maybe part of the problem was due to not so accurate build of these deltas but another reason could be associated with the way measurements are performed. Once I switched to the median filter code by Brad Hopper the results of auto-calibration improved notably on both printers. 


Now it seems I am getting good prints from both printers and start to feel a bit more confident about this type of printer, so I guess I am venturing in a new type quite soon: Ingentis/Eustathios are next.


Sunday, May 11, 2014

Mobile data services for Japan visitors

On the occasion of a trip to Japan, I had to look for a way to stay connected while on the go. Though most hotels will offer free wifi to guests, having an Internet connection while trying to navigate the city is most welcome. And if you are to believe the claim, Tokyo is the most populated city of the world. It certainly has an impressive public transportation system with many different companies just for the light trains and underground systems.

Google Maps seems to be properly in synch with local companies schedules and provided accurate results on how to go from point A to point B within the city. But to be able to use it you need Internet mobile access. And this is where Japan seems a bit odd for the visitor: It seems you cannot buy a prepaid voice or data SIM card unless you are Japanese. Maybe I am missing something here but that was what I learned from my online search.

One notable exception seems to be B-mobile VISITOR SIM, which offered pre-paid data service SIM card.

Fortunately, what you cannot buy, you can rent. So there are a handful of companies that can rent you a SIM card provided you are carrying an unlocked phone. Or else you can rent a phone too, this way you are certain the phone is going to play nice with the SIM card. But what surprised me the most was the availability of mobile wifi hot-stops, that will get their Internet from 4G or WiMAX networks and will offer wifi connectivity to all the devices within a few meters of the unit. This mobile hotspot is similar size of a cellphone and with a battery that will last for a few hours of operation.

In the end, we were lucky because the Japanese hospitality of our friends provided us both, a voice SIM card and a mobile wifi/WiMAX device for free. That meant the whole family was able to be online all the time using the wifi hotspot. I totally can recommend this type of service even if you have to pay for it as it worked nicely not only in the cities but also in our Shinkansen rides.

Finally, another service worth mentioning are public wifi networks. The one I used was Wi2, that offered one day of free wifi for VISA card holders. I used the free service to log on the Internet on arrival during our ride on the Narita Express train that connects the airport with the city.  It may not work everywhere but it worked for us and it did not cost us a dime.