Monday 22 October 2018

Raspberry Pi Zero W and Raspberry Pi 3 headless setup

As I mentioned in an earlier blog, the RPi-Cam-Web-Interface package is a much better fit for Raspberry Pi, and particularly a Pi Zero than packages like motion / motioneye. This is primarily because RPi-Cam-Web-Interface exploits the tight integration between a Raspberry Pi and a Raspberry Pi Camera, to be faster and more efficient than is possible using more generic interfaces. This allows the reliable use of faster framerates and / or higher resolutions.

This post describes the initial setup of a Raspberry Pi, including connecting it to a home network and accessing it from a PC, laptop or tablet on the home network.

Preparing to power on for the first time

This stage has the following steps:
  1. Put raspbian onto the micro SD card
  2. Tweak the micro SD card to enable access from you wifi network
  3. Insert into the raspberry pi and power on
  4. Access the Raspberry pi from another computer.

Put Raspbian onto the the micro SD card

Normally you only need to to this once, but if you want to start again from square one for any reason, then you can do this again. It WILL overwrite the SD card so any files there before you do this will disappear.


The easiest way to get a shiny fresh installation of Raspbian onto the SD card is to use Etcher, which works on Windows, Linux and MAC - it doesn't however run on tablets or phones, so for now this step has to be done on a desktop or laptop PC.

There is an excellent and full guide to using Etcher here, and there is a fairly detailed video here. Below are a couple of extra bits of info and a short guide if you don't need all the background info.

Use Raspbian Lite NOT full Raspbian.

Don't immediately put the SD card into your pi after running Etcher - there are a couple of extra things first (see step 99 below).

To minimise the overheads and get the best out of your pi I recommend using Raspbian Lite - this is especially useful on a Raspberry Pi Zero which has more limited processor power and memory than its bigger brothers.

Text version - flashing the SD card:


  1. Download Etcher from here. The Download for xxx button normally has the right version selected, so you don't need to be puzzled by the various option that appear if you open the drop down box.
  2. Install Etcher on your PC
  3. Download Raspbian Lite - Click on Download  ZIP under Raspbian Stretch Lite on the right of this page On the pop-up window, ensure Save File is checked and click OK. If you start at the main Raspberry Pi download page, click on Raspbian (NOT NOOBS) to get to the page with Raspbian Lite on it.
  4. Put the micro SD card in a suitable adapter - either a USB adapter or a full size SD card adapter if your PC / laptop has a full size SD card reader.
  5. Plug in the adapter. Ignore any messages from the operating system, and close any windows that pop-up ( DONT CLOSE ETCHER!)
  6. Run Etcher - on Windows press the Windows key and it should be near the top under "recently added". You can also press the Windows key and type etcher, and it should appear beside something that looks like a very small (vinyl) record.
  7. In Etcher Click on Select Image and then click on downloads at the top of the left pane. Select the ZIP file downloaded from raspberrypi.org.
  8. The middle section of Etcher should already be showing your micro SD card and will skip straight to highlight Flash. Click on Flash! and wait for the card to be flashed and verified.
  9. Remove the SD card adapter from the PC, DONT PUT IT IN THE PI YET!

Text version - final tweaks to the card:

After watching countless numbers of really awful videos, this one is reasonable. Ignore the first part about imaging the disc - start at around 1:40. This video does things in reverse order, and carries on to some of the configuration steps I have in the next section. Use the extended info below for the wpa-supplicant file however.
  1. Put the adapter back in the PC and, using File Manager, find and open the boot disk - look in This PC to find it.
  2. Right click in the file area and from the drop down select New then Text Document. Rename the new text document to ssh and remove the '.txt' (you will probably need to enable File name extensions in the View Tab at the top of the screen)
  3. Now create another new document and add the following contents:
    country=GB
    update_config=1
    ctrl_interface=/var/run/wpa_supplicant
    
    network={
     scan_ssid=1
     ssid="MyNetworkSSID"
     psk="mypassword"
    }
  4. change MyNetworkSSID to the name of your wifi network, and likewise the password. Leave the quotes in place.
  5. rename this file to wpa_supplicant.conf
  6. Safely remove the adapter from your PC and remove the micro SD card.

First switch on and connecting from PC

Starting the Pi

This is easy. plug the micro SD card into the Pi and then connect power to the micro USB power adapter (the one at the very end of the card). The green light should flicker a bit after a few seconds. It will take 20 seconds to 1 minute to start this first time, subsequent boots will be faster.

Connecting from linux

This one is really easy:
  1. Open a new terminal window and enter this command:
  2. ssh -l pi raspberrypi
  3. Enter yes at the fingerprint prompt, hit Return
  4. Enter the preset password raspberry at the password prompt, hit Return. The session should start
If the device cannot be found (ssh: Could not resolve hostname raspberrypi) see the problem solving section at the end of this blog

Connecting from Windows


Installing PuTTY

Once only, you need to install PuTTY. There is a good guide here, it is best to follow that guide.

Connecting

Once installed, run PuTTY as described here. The previous video also has a good section on this starting at around 5:15. When you first power up your pi it should connect if you enter
raspberrypi
as the host name. If that does not work, try
raspberrypi.local
Login with username pi and password raspberry. Now it's time to do a little bit more setup.

If even raspberrypi.local fails see the problems section at the end of this post.

Connecting from Mac

For now the best advice I can give is to follow this.

Final setup of Raspberry Pi

Once logged in there are a few further steps before setting up the camera software:
  1. Change the hostname
  2. Change the password
  3. set the local language (which also makes the keyboard behave)
  4. enable the camera
These are all done using raspi-config.
sudo raspi-config
This also is in the video at 6:55. It doesn't cover enabling the camera, but it is in raspi-config in the Interfacing Options sections.

Reboot the Raspberry Pi. Now we are ready to setup the camera software which I'll cover in a separate post.

Problems?

ssh / putty  fails to connect

Sometimes raspberrypi fails to connect.

try raspberrypi.local instead.

If that fails you will need to use the pi's IP address. You should be able to find this in your router's web pages, but exactly how varies from router to router.



Tuesday 16 October 2018

Making a cheap and flexible trailcam with Raspberry Pi



I know there are quite a few versions of this around, but after seeing the short item on Springwatch about a DIY Raspberry Pi based I thought it would be good project for any at the local U3A who still fancied a play with technology, but wanted some help / backup.

So I started at the recommended web site, ordered a kit, nicked a powerbank from another project and set off.

The I made case is distinctly Blue Peter, but functional and I used a glue gun for the first time in my life (only somewhat messilly!) I used a recycled carry out box, some cardboard and the top of an old bottle as a lens shield.

After a couple of hiccups due to not setting up the config files properly on the memory card (so the wifi didn't hook up), I just used the supplied config and it was up and running.

The powerbank (Anker Powercore 10000) works a treat and will run the setup for much more than 24 hours.

BUT

The software is pretty limited and limited to pi zero W and pi B 3 and the only network option is to setup as a wifi hotspot - so to use the camera you need to change the wifi  setup on whatever device you use (phone, tablet, laptop etc) to the camera (and of course loose all acess to the rest of the world in the meantime). Clearly the bunch of folks who wrote this software have such large gardens their home wifi doesn't reach the edges.

For me, I'd rather be able to use any sensible network option - including a private hotspot if appropriate, but also using any existing wifi, or even wired LAN (allowing the use of power over ethernet so there is not battery problem).

A bit of digging suggested that this motion software would work well even on a Pi Zero. It works well, and does seem to do everything necessary pretty well. It also enables multiple cameras (even on multiple Raspberry Pis) to be managed through a single interface. This package however, loads a Pi Zero quite heavily and this means that video frame size has to be scaled back to avoid overloading the a Pi Zero.

I'm also looking at RPi-Cam-Web-Interface, which is written to exploit the Raspberry Pi Camera with its built in GPU support. Although not quite as sophisticated as motion, this may be a better option overall for a Pi Zero in particular. I'll post more about this later.

The gory details of the entire Raspberry Pi build process for motioneye on raspbian lite are below (elapsed time on pi Zero in brackets):

Friday 3 August 2018

log book notes: trinamic 5130-bob on Raspberry pi

These are notes on using a trinamic 5130-bob on Raspberry Pi.
Here is a short video of it running....

I intend to have a Python interface to the device eventually.

I'm running this on a pi 3b+ with raspbian lite installed.

I'm basically following this page, but switching 5160 to 5130.

The broadcom driver version I have is 1.56. (check here)
wget http://www.airspayce.com/mikem/bcm2835/bcm2835-1.56.tar.gz
tar zxvf bcm2835-XXX.tar
cd bcm2835-XXX
./configure
make
sudo make check
sudo make install

https://www.trinamic.com/fileadmin/assets/Support/TTAP/TMC-API_Release_v3.03.zip

The trinamic software also needs wiringPi installed....

And you need to follow their (trinamic) directory instructions to make to work.

Finally small differences in the detailed spec between 5130 and 5160 mean that the GCONF setting should be 04, not 0C - see main.c line 39 on the trinamic website page linked above.


I could now drive a motor successfully. I have added a few more tweaks to the code which are detailed below. (The code is here as well)

Saturday 31 March 2018

DC motor control with an RPi - writing the software

This explains some of the lessons learned and techniques I have used to develop Raspberry Pi software to provide accurate and responsive control for DC motors using feedback from rotary encoders.

It follows on from my previous post, showng the results of some initial testing on the feasability of good motor control using just a Raspberry Pi (i.e. without an arduino or other micro controller).

I very much liked the approach described by David Anderson explaining his approach to basic robot control, so the overall approach I used was to write software that is called from a regular timer function to run the control loop.

Such software can then be run directly from some higher level control loop, or wrapped up to provide a freestanding process controlled through a pipe or web service.

My usual approach to time / function critical software is to start with Python and get to a point where:
  • it all works well - great - job done.
  • it is hopeless - its never going to work this way - try something completely different or give up.
  • its working, but not quite well enough - perhaps a couple of small key parts can be re-implemented -possibly in C.
In this case - so far at least - the pure python version looks to be doing the job well.

I have a couple of repositories on github with the code for this, but these are still very much a work in progress.

motor drivers are here.

simple robot control is here. - So far this only does remote control from a web browser.

Wednesday 21 February 2018

U3A robot - get the motors running

This is a record explaining the build on the robot RaspberryPi.

For now we're using the adafruit DC motor hat
  1. Fresh SD card image with Raspbian stretch lite
  2. Add wpa-supplicant file and ssh file to card
  3. Boot up pi and log in via ssh
  4. expand filesystem, change password, and change machne name (raspi-config)
  5. enable i2c (raspi-config)
  6. mkdir github, cd github
  7. sudo apt-get install git python3-dev python3-pip
  8. sudo apt-get install nfs-kernel-server  # if you want to remotely access files on this pi
  9. install the adafruit python library and setup
  10. make sure you are in the Adafruit examples library:
    cd ~/github/Adafruit-Motor-HAT-Python-Library/examples
Here's the motor HAT plugged into an Rpi Zero, the power is taken from the RPi's 5V supply (these are only little motors) and motors 3 & 4 are hooked up on my baby robot chassis. The example program DCTest.py now happily drives one of the motors.

Sunday 4 February 2018

DC motor with rotary encoder feedback control using only a Raspberry Pi

In messing about with DC motors I knew I wanted to track position accurately, and I hoped I could do this with just an RPi, but all the advice and even some youtube videos said it couldn't be done reliably without using an arduino or other external controller - usually because the feedback loop timing requirements can't be met by an RPi. But having done a few very simple sums, it seemed to me it should be quite practical:
  • motor running at 10,000 rpm, with (say) 3 pole rotary encoder gives 500 pulses / second
That's pretty slow really - a package like pigpio says it can reliably time things to 5 microseconds or around  40 times faster than the pulse rate - so where's the problem? This nice thread here looked encouraging......

2 problems at least in what others have tried:
  1. trying to do this on an RPi running the full gui. Well gui's are well knows for being *really* nasty if you're trying to do anything time critical, if you want  an RPi to do something that has previously been done on dedicated hardware or low level machines like arduinos, starting by running a gui is like swimming in concrete boots!
  2. The VAST majority of code examples on picking up edges / pulses are using code looping reading the GPIO until it changes. Good grief, nice and simple, but REALY shouldn't be used other than a quick breadboard test to see if something appears to be working. Programming 101 grade F code.
So lets try and do this sensibly:
  1. Use a raspbery Pi Zero - cos we want something small, low power and cheap and if it works on a zero it will work on any other recentish Pi.
  2. Use raspbian lite. We can put the gui somewhere else - or use a web browser with the Zero running a baby web server.
  3. Use pigpio's daemon to do the hard work.
  4. Write in python - 'cos if it works reasonably well in python we can always use C++ to hand crank the 1 or 2 little bits that are critical.
  5. Use a pipgio callback to pick up the edges - in fact better still just use the callback tally function, because we probably only need the feedback loop to run 20 times a second or so.
So after couple of days messing about I have an untidy but working dc motor controller:
  1. Raspberry Pi Zero
  2. 2.5Ah power bank - Promate Aidbar-2
  3. Pure python3
  4. micrometal DC motor
  5. pololu magnetic rotary encoder
  6. H bridge in a pHat to drive the motor. (in fact I use pigpio PWM to drive the H bridge - it's about 1/2 the cpu load of the pimoroni library)
  7. home rolled motor control class with simple PID feedback running at 20Hz
The motor runs smoothly; although the low level control is quite jittery this is smoothed out pretty well by the motor's rotational inertia. Maybe some smoothing on the derivative component would help - I'll try that later.
The motor flat out no load runs at just over 500 ticks per second, this test is at 300 ticks per second and once initial correction has completed, the error is only 1% - 2%. This is with no load. The next graph shows the response to load changes:

This is a very basic test - I just squeezed the output wheel and released it a few times - sometimes to the point of nearly stalling the motor.