Blog 21
!BETA!
This is used for The project:
Hardware used on Raspberry Pi:
- RPi_UI board | (User Interface)
- DIO | (DIO)
- Jumper cables M-F
- 4 PIN I2C cable F-F
- Analog meters
Programmed with:
- Bash
- Bw tool
Connecting the analog meters
While making the analog meter clock, I encountered the problem. That I had one Alternating current voltage. For this I had to
// blabla checked it out by putting the power resource after the diode.
To check the analog meter I connected it with a power resource to find out if at which voltage it went to it's maximum. Fast I found out that It went to it's maximum. To change that it went so fast to it's maximum I added two resistors. And removed the connection with the normal resistor. // blabla
To check if the meter you have work on the DIO. Put the minus part of your meter on the GND(Pin 1), and the positive side on the VCC(Pin 2). The pointer will directly go to it's to the right. ( If he doesn't you have to remove some resistors )
To connect the meters on the DIO: I did my positive cable on IO0, what is pin 3. ( The other cable has to go to GND Pin 1 ) On the wiki page of DIO you can see, which pin is what.
Change analog meter value through the command line
Recommended to use the DIO protocol.
I have in my example the analog meter connected with pin 3(IO0).
Pin 3 is IO0, so it will get the first value and that is one.
To set pin 3 as output:
bw_tool -I -D /dev/i2c-1 -a 84 -W 30:01
To enable the PWM:
bw_tool -I -D /dev/i2c-1 -a 84 -W 5f:01
To let the pointer go to 50% of the analog meter:
bw_tool -I -D /dev/i2c-1 -a 84 -W 50:80
The value is in hexadecimals so that is why 80 is 50%.
If you are going to use a pin like pin 10(IO6). With the value 40 for register 30 and 5f. The reason it is 40 is, because the bits are in hexadecimals. So, 64 decimal bits gets calculated to 40 hexadecimals.
The reason why this is getting used, is because it is bit masked. With that you can add multiple pins in the command. So, if you you want pin 4(IO1) and pin 6(IO3) on:
IO1 + IO3 -> 02 + 08 = 0A
For the full Bit Mask list of values you have to go to the DIO protocol
Making the sticker
DIO Analog meter - Clock
With this script, I am going to make on the analog meter visible how late it it. For now I only have one analoge meter that works, so I will only show how late it's in hours. The script is pretty easy to understand, but I will still give some parts explanation.
This is the onexit script, What it does is when the script crashes or this function get named by the script. I will do the given commands and then exit the running script. So, in my case it turns the PWM back to zero on pin 3 IO0, which makes the pointer go back to the left. If you use a different Pin and don't know which one to use you have to look at the DIO page.
trap onexit 1 2 3 15 ERR function onexit() { $DIO -W 50:00 #Turns PWM back to zero $UI -W 10:00 #Clears screen exit }
This obviously looks at which hour it's and puts it in the directory name Hour.
Hour=`date +%H`
What then gets printed on the display.
$UI -t "Clock=" $Hour
The if statement looks at which hour there is given and looks if it is greater than the given value in $Twelve. If it is 12 o’clock or later it will subtract 12 of it. So, for example 18 will be 6.
if [ "$Hour" -gt "$Twelve" ]; then Hour=$(( $Hour - $Twelve )) fi
In the Array stands the amount of steps with the value it should give in hexadecimals.
array=( 00 17 2E 45 5C 73 8A A1 B8 CF E6 FF ) # Element 0 1 2 3 4 5 6 7 8 9 10 11
After that one the second row of the LCD display the value will be printed of the new hour ( if it is above 12 ) and the hexadecimal value in the array.
$UI -W 11:20 $UI -t "Hour=$Hour Array="${array[$Hour]}
The full script:
#!/bin/bash DIO="bw_tool -I -D /dev/i2c-1 -a 84" UI="bw_tool -I -D /dev/i2c-1 -a 94" Twelve="12" trap onexit 1 2 3 15 ERR function onexit() { $DIO -W 50:00 #Turns PWM back to zero $UI -W 10:00 #Clears screen exit } while true; do Hour=`date +%H` # Hour=$((Hour + 6)) #I made this at 12:00, so I added 6 so I can see if the meter works $UI -W 10:00 $UI -t "Clock=" $Hour if [ "$Hour" -gt "$Twelve" ]; then Hour=$(( $Hour - $Twelve )) fi array=( 00 17 2E 45 5C 73 8A A1 B8 CF E6 FD ) # Element 0 1 2 3 4 5 6 7 8 9 10 11 $UI -W 11:20 $UI -t "Hour=$Hour Array="${array[$Hour]} $DIO -W 50:${array[$Hour]} sleep 5 done
DIO Analog meter - Timer
In this script I made a minute timer. The analog meter will starts at maximum PWM and ends at zero. You can make the timer less longer by changes the value or by changing the sleep time.
What an onexit does I already explained in my previous DIO analog meter - Clock project above. But ewhat I added this time to the script is an mplayer file so that when the script is done a song gets played.
trap onexit 1 2 3 15 ERR function onexit() { $DIO -W 50:00 #Turns PWM back to zero $UI -W 10:00 #Clears screen #mplayer Song.mp3 exit }
In this if statement it looks if the values are both zero, if that is the case it will run the function onexit.
if [ "$Length" = "$Zero" ]; then onexit fi
Thanks to that a hexadecimal calculation can be made. Which is that the previous length will counted down by the given value.
That will then be saved in Length direction.
Length=`(echo obase=16; echo ibase=16; echo $Length - $Value) | bc`
The full script:
#!/bin/bash DIO="bw_tool -I -D /dev/i2c-1 -a 84" UI="bw_tool -I -D /dev/i2c-1 -a 94" Length="FF" Value="11" Zero="0" trap onexit 1 2 3 15 ERR function onexit() { $DIO -W 50:00 #Turns PWM back to zero $UI -W 10:00 #Clears screen #mplayer Song.mp3 exit } while true; do $DIO -W 50:$Length if [ "$Length" = "$Zero" ]; then onexit fi Length=`(echo obase=16; echo ibase=16; echo $Length - $Value) | bc` $UI -W 11:00 $UI -t "Seconds: " $Length sleep 4 done onexit