近日因為AlphaGo(阿爾法)和李世石的比賽,挑起我的圍棋興致,我也趁熱鬧和電腦下幾盤圍棋,但是人始終有情緒、會疲倦、易分心…等等問題,不像電腦那樣表現穩定。我和電腦下棋,各有勝負,可是,遇到一局很特別的計分結果,原來日本計法和中國計法可以有不同的勝負結果,真難得,所以要分享給棋友們看看,如下圖示。
Best practice to manage Information Technology System in Factory and Manufacturing Environment
Today, I setup my raspberry pi as a temperature sensor. I mainly use a LM35 temperature sensor and an IC “ADC0804” as an analog to digital converter. I also setup a database to record down the temperature data and then display result on web browser with Chat format. The connection of the whole electronics circuit is as below diagram. 
1) The coding the a python program to take temperature data is as the temp_url.py program below:
#!/usr/bin/env python
# author: Powen Ko Program Name: temp_url.py
import time, RPi.GPIO as GPIO
import urllib
def fetch_thing(url, params, method):
params = urllib.urlencode(params)
if method==’POST’:
f = urllib.urlopen(url, params)
else:
f = urllib.urlopen(url+’?’+params)
return (f.read(), f.code)
GPIO.setmode(GPIO.BOARD)
GPIO.setup(7, GPIO.IN)
GPIO.setup(11, GPIO.IN)
GPIO.setup(12, GPIO.IN)
GPIO.setup(13, GPIO.IN)
GPIO.setup(15, GPIO.IN)
GPIO.setup(16, GPIO.IN)
GPIO.setup(18, GPIO.IN)
GPIO.setup(22, GPIO.IN)
while True:
a0 = GPIO.input(7)
a1 = GPIO.input(11)
a2 = GPIO.input(12)
a3 = GPIO.input(13)
a4 = GPIO.input(15)
a5 = GPIO.input(16)
a6 = GPIO.input(18)
a7 = GPIO.input(22)
total=a0+(a1*2)+(a2*4)+(a3*8)+(a4*16)+(a5*32)+(a6*64)+(a7*128)
temp=total*5*1000/256/10;
print a7,a6,a5,a4,a3,a2,a1,a0,”[“,total,”]”,”[C=”,temp,”]”
content, response_code = fetch_thing(
‘http://127.0.0.1/settemp.php’,
{‘id’: 1, ‘temp’: temp},
‘GET’
)
time.sleep(5)
2) Then, I save the temperature data into the database via a web php program as below:
<?php
$con=mysqli_connect(“localhost”,”root”,”infotech”,”raspberryDB”);
if (mysqli_connect_errno()) {
echo “Failed to connect to MySQL: ” . mysqli_connect_error();
}
$now= date(‘Ymdhms’);
$id = $_GET[‘id’];
$temp = $_GET[‘temp’];
mysqli_query($con,”INSERT INTO temp (datatime,temp,userid)
VALUES ($now,$temp,$id)”);
mysqli_close($con);
echo “powenko.com get it”.”, date time=”.$now.”, temp=”.$temp.”, id=”.$id;
?>
Finally, I view data by using a php web browser program as below and also screen dump result as below:
<!doctype html>
<html>
<head>
<title>Bar Chart</title>
<script src=”Chart.js-master/Chart.js”></script>
</head>
<body>
<div style=”width: 50%”>
<canvas id=”canvas” height=”450″ width=”800″></canvas>
</div>
<?php
$con=mysqli_connect(“localhost”,”root”,”infotech”,”raspberryDB”);
if (mysqli_connect_errno()) {
echo “Failed to connect to MySQL: ” . mysqli_connect_error();
}
$result = mysqli_query($con,”SELECT * FROM temp”);
echo “<table border=’1′>
<tr>
<th>Date Time</th>
<th>Temperature</th>
<th>user ID </>
</tr>”;
while($row = mysqli_fetch_array($result))
{
echo “<tr>”;
echo “<td>” . $row[‘datatime’] . “</td>”;
echo “<td>” . $row[‘temp’] . “</td>”;
echo “<td>” . $row[‘userid’] . “</td>”;
echo “</tr>”;
$Lables=$Lables.'”‘. $row[‘datatime’].'”,’;
$temps=$temps.'”‘. $row[‘temp’].'”,’;
}
echo “</table>”;
mysqli_close($con);
?>
<script>
var barChartData = {
labels : [<?php echo $Lables; ?>],
datasets : [
{
fillColor : “rgba(20,20,20,0.5)”,
strokeColor : “rgba(220,220,220,0.8)”,
highlightFill: “rgba(220,220,220,0.75)”,
highlightStroke: “rgba(220,220,220,1)”,
data : [<?php echo $temps; ?>
]
}
]
}
window.onload = function(){
var ctx = document.getElementById(“canvas”).getContext(“2d”);
window.myBar = new Chart(ctx).Bar(barChartData, {
responsive : true
});
}
</script>
</body>
</html>
我在現時這家醫療設備工廠做了差不多一年,看著它由四條生產線減至一、二條生產線,工人由七百減至三百,但是要負擔百多名職員,今年的盈虧已經可以預計了,如果未來幾個月的生意不能改善,裁員是不可避免的。我要做好準備,又要開始積極地找另一份新工作了。
Raspberry Pi is an excellent automation control unit, and we can use it to build a voice recognition feature in order to make it as a voice automation control unit. Yeah, is it very interesting ! In the following, I will show you the script to build voice feature, including converting speech to text, converting text to speech, auto-reply a text question.
I take the benefit of using google speech recognition ver 2 feature and arecord feature of Raspberry Pi. To remind that you should apply your google api key for usage in this script, as below:
#!/bin/bash
echo “Recording…”
arecord -D plughw:1,0 -f cd -t wav -r 16000 –duration=4 test.wav
avconv -i test.wav -y -ar 16000 -ac 1 test.flac
echo “Processing…”
wget -q -U “Mozilla/5.0” –post-file test.flac –header “Content-Type: audio/x-flac; rate=16000” -O – “https://www.google.com/speech-api/v2/recognize?client=chromium&lang=en_US&key=AIzaSyB0RJilwaAhMpftgmgRhgEzd4lZnia1MwQ” |cut -d” -f8 >stt.txt
echo “You said: “
value=`cat stt.txt`
echo “$value”
The screen dump result to run speech2text.sh program is as below:
It is a python program using Wolframalpha’s API add-on tools to process a question as below script, and you should apply a app ID from http://products.wolframalpha.com/api/:
import wolframalpha
import sys
# Get a free API key here http://products.wolframalpha.com/api/
# This is a fake ID, go and get your own, instructions on my blog.
app_id=”VWQU6P-YPRRG752XH”
client = wolframalpha.Client(app_id)
query = ‘ ‘.join(sys.argv[1:])
res = client.query(query)
if len(res.pods) > 0:
texts = “”
pod = res.pods[1]
if pod.text:
texts = pod.text
else:
texts = “I have no answer for that”
# to skip ascii character in case of error
texts = texts.encode(‘ascii’, ‘ignore’)
print(texts)
else:
print(“Sorry, I am not sure.”)
To run the python program as script –> python3 queryprocess.py “What is your name”, then we can get a reply result as “My name is Walfram|Alpha.”, as below screen dump.
We can use Espeak utility to convert text to speech under Raspberry Pi. Its installation is very simple as below:
$ sudo apt-get install espeak
After installation, you can run the espeak program to speech, for example,
$ espeak "Hello World"
I develop a script to combine the above three program into one, so that you can use it to speech a question and wait for a voice answer. Let’s see the script of main.sh program as below:
#!/bin/bash
echo “Recording… Press Ctrl+C to Stop.”
./speech2text.sh > /dev/null 2>&1
QUESTION=$(cat stt.txt)
echo “Me: “ $QUESTION
python3 queryprocess.py $QUESTION > ans1.txt
ANSWER=$(cut -c3- ans1.txt)
ANSWER1=$(echo “$ANSWER” | sed -e ‘s/\n/ /g’)
ANSWER2=${ANSWER1::-1}
echo “Robot: “ $ANSWER2
espeak “$ANSWER2” > /dev/null 2>&1
To run this program as script –> ./main.sh, then we can get a reply result as below screen dump, and with voice reply, too.
We can use python to develop a program to capture any city’s weather forecast from openweathermap.org web site under our Raspberry Pi computer. I list our program and screen capture result in the following for your reference.
import urllib.request,json
city = input(“Enter City: “)
def getForecast(city) :
#url = “http://api.openweathermap.org/data/2.5/forecast/daily?cnt=7&units=meteric&mode=json&q=”
#url = “http://api.openweathermap.org/data/2.5/forecast/city?id=524901&APPID=42443ecbdcad3d01842205e3745895cd”
#url = “http://api.openweathermap.org/data/2.5/forecast/daily?cnt=7&units=meteric&mode=json&q=LONDON&lang=zh_cn&APPID=42443ecbdcad3d01842205e3745895cd”
url = “http://api.openweathermap.org/data/2.5/forecast/daily?cnt=7&units=meteric&mode=json&q=”
url = url + city + “&lang=zh_cn&APPID=42443ecbdcad3d01842205e3745895cd”
req = urllib.request.Request(url)
response=urllib.request.urlopen(req)
return json.loads(response.read().decode(“UTF-8”))
forecast = getForecast(city)
print(“Forecast for “, city, forecast[‘city’][‘country’])
day_num=1
for day in forecast[‘list’]:
print(“Day : “, day_num)
print(day[‘weather’][0][‘description’])
print(“Cloud Cover : “, day[‘clouds’])
print(“Temp Min : “, round(day[‘temp’][‘min’]-273.15, 1), “degrees C”)
print(“Temp Max : “, round(day[‘temp’][‘max’]-273.15, 1), “degrees C”)
print(“Humidity : “, day[‘humidity’], “%”)
print(“Wind Speed : “, day[‘speed’], “m/s”)
print()
day_num = day_num+1
This function can be further developed to save weather forecast data to database, and then display in a chart format on screen. I may do it if I have time in future.
We can use python programs to start a server side and client side network communication service and allow them to transmit message to each other under a Raspberry Pi. For example, we start two LXTerminal Sessions under a Raspberry Pi (or two difference Pi), and then run the following script.
In Server Side, run the following script:
import socket
comms_socket = socket.socket()
comms_socket.bind((‘localhost’, 50000))
comms_socket.listen(10)
connection, address = comms_socket.accept()
while True:
print(connection.recv(4096).decode(“UTF-8”))
send_data = input(“Reply: “)
connection.send(bytes(send_data, “UTF-8”))
In Client Side, run the following script:
import socket
comms_socket = socket.socket()
comms_socket.connect((‘localhost’, 50000))
while True:
send_data = input(“message: “)
comms_socket.send(bytes(send_data, “UTF-8”))
print(comms_socket.recv(4096).decode(“UTF-8”))
The testing result is shown as below screen dump for your reference:
Although it is easy to start-up IIS under Window O/S or Apache under Unix O/S, we still have another choice to start a web server service using Python programming tools. You only need to install python, and then start python and run the following script line by line:
import http.server, os
#define the server document directory with unix path;
os.chdir(“UsersadministratorDocuments”)
#if it is window env with directory as c:UsersadministratorDocuments
os.chdir(“/Users/goldmanau/Documents”)
httpd = http.server.HTTPServer((‘127.0.0.1’, 8000),
http.server.SimpleHTTPRequestHandler)
httpd.serve_forever()
This script can work under either python 2.7 or 3.x version under window or Unix environment. If you put the index.html to the server document path, then, you can start a web browser and input the link as http://127.0.0.1:8000/index.html in order to display your web page. It is the most easy, simple, fast way to start a web server service.
If you want to upload file from or to DropBox through Raspberry Pi, it is easy to do so. The following will show you a a installation program and its setup steps.
First of all you need a DropBox account and apps account through the following links. Hop on over to dropbox is free.
You then need to visit this link https://www.dropbox.com/developers/apps, login to DropBox and create an “app” by clicking the “create app” button.
Then choose “Dropbox API app”, “Files and Datastores”, and answer the final question “Can your app be limited to its own, private folder?” – either answer is OK, depending on your needs. The result will be as below:
Get Dropbox Uploader onto your Pi
$ cd ~ (this ensures you are in /home/pi)
$ git clone https://github.com/andreafabrizi/Dropbox-Uploader.git
$ ls
(If this fails, you may need to install git with sudo apt-get install git-core)
You should be able to see a directory called Dropbox-Uploader
$ cd Dropbox-Uploader
$ ls
You should now see three files, one of which is called dropbox_uploader.sh. This is the script we’re going to use.
$ ./dropbox_uploader.sh
Run the script with ./dropbox_uploader.sh (if it fails, try chmod +x dropbox_uploader.sh)
If access right problem still occurs, run the following command:
$ sudo ./dropbox_upload.sh
Sorting out the DropBox API keys and authorization. You need to give your app a unique name, and you will be assigned some keys to go with the name. Now you need to enter your app’s DropBox API keys and secret. Once you’ve entered your keys and answered the question “app” or “full”, your Pi will request an authorisation token and you will be given a web URL you need to visit to activate it…
The following is the whole setup screen dump from my Raspberry Pi for your reference:
pi@gopi2:~ $ git clone https://github.com/andreafabrizi/Dropbox-Uploader.git
Cloning into ‘Dropbox-Uploader’…
remote: Counting objects: 718, done.
remote: Total 718 (delta 0), reused 0 (delta 0), pack-reused 718
Receiving objects: 100% (718/718), 213.12 KiB | 190.00 KiB/s, done.
Resolving deltas: 100% (369/369), done.
Checking connectivity… done.
pi@gopi2:~ $ cd Dropbox-Uploader
pi@gopi2:~/Dropbox-Uploader $ ls
CHANGELOG.md dropbox_uploader.sh dropShell.sh LICENSE README.md
pi@gopi2:~/Dropbox-Uploader $ ./dropbox_uploader.sh
This is the first time you run this script.
1) Open the following URL in your Browser, and log in using your account: https://www.dropbox.com/developers/apps
2) Click on “Create App”, then select “Dropbox API app”
3) Now go on with the configuration, choosing the app permissions and access restrictions to your DropBox folder
4) Enter the “App Name” that you prefer (e.g. MyUploader271401743117612)
Now, click on the “Create App” button.
When your new App is successfully created, please type the
App Key, App Secret and the Permission type shown in the confirmation page:
# App key: 0pmq2laok7xxxxx
# App secret: d5fh2kgyd2xxxxx
Permission type:
App folder [a]: If you choose that the app only needs access to files it creates
Full Dropbox [f]: If you choose that the app needs access to files already on Dropbox
# Permission type [a/f]: a
App key is 0pmq2laok7tinna, App secret is d5fh2kgyd2uyftx and Access level is App Folder. Looks ok? [y/n]: y
Token request… OK
Please open the following URL in your browser, and allow Dropbox Uploader to access your DropBox folder:
https://www.dropbox.com/1/oauth/authorize?oauth_token=qH829qJuKZpxxxxx
Press enter when done…
Access Token request… OK
Finally, your DropBox account connected to your “app”
Besides Raspberry Pi operation, you also need to allow the access of Dropbox from Raspberry Pi as below two screens:
$ cd home/pi/Dropbox-Uploader
$ ./dropbox_uploader.sh upload /home/pi/upload_file_fr name_of_upload_file_to
This will upload the file you choose to your DropBox account.
…or use it in a Python script like this…
from subprocess import call
photofile = “/home/pi/Dropbox-Uploader/dropbox_uploader.sh upload /home/pi/photo00001.jpg photo00001.jpg”
call ([photofile], shell=True)
If we upload “license” & “license1” files to Dropbox, it will show the result as below:
Finally, if you look at the DropBox Uploader documentation, there’s a lot more commands you can make use of…
If you want to backup your Raspberry Pi system image from SIM card, you can use the HDD Raw Copy Tool as described below.
Developer: HDDGURU.COM
License terms: Freeware
Supported OS: MS Windows XP, Vista, 7, 8, Server 2003, 2008, 2008R2
HDD Raw Copy Tool is a utility for low-level, sector-by-sector hard disk duplication and image creation.
HDD Raw Copy tool makes an exact duplicate of a SATA, IDE, SAS, SCSI or SSD hard disk drive. Will also work with any USB and FIREWIRE external drive enclosures as well as SD, MMC, MemoryStick and CompactFlash media.
The tool creates a sector-by-sector copy of all areas of the hard drive (MBR, boot records, all partitions as well as space in between). HDD Raw Copy does not care about the operating system on the drive – it could be Windows, Linux, Mac, or any other OS with any number of partitions (including hidden ones). Bad sectors are skipped by the tool.
If your media has a supported interface then it can be copied with HDD Raw Copy!
In addition, HDD Raw Copy can create an exact raw (dd) or compressed image of the entire media (including service data such as MBR, Boot records, etc). Again, all filesystems (even hidden) are supported.
Examples of possible uses
Raspberry Pi has a build-in sound card, HDMI and phone jack output to play sound. If you connect to HDMI display or plug-in a headphone to it, you can play sound. The setup of sound feature is easy as described below.
$ sudo apt-get install git-core
$ git clone git://github.com/StevenHickson/PiAUISuite.git
$ ./InstallAUISite.sh
(be aware to answer pop-up question to continue installation)
$ modprobe snd_bcm2835
$ amixer controls
numid=3,iface=MIXER,name=’PCM Playback Route’
numid=2,iface=MIXER,name=’PCM Playback Switch’
numid=1,iface=MIXER,name=’PCM Playback Volume’
$ amixer cset numid=3 1
where 0 for auto-select, 1 for headphone, 2 for HDMI.
$ sudo amixer cset numid=1 60%
to set the volume between 0 – 100%, 0 for mute.
$ sudo amixer set PCM – 60%
$ sudo omxplayer voice.mp3
If omxplayer’s auto-detection of the correct audio output device fails, you can force output over hdmi with:
$ sudo omxplayer-o hdmivoice.mp3
or you can force output over the headphone jack with:
$ sudo omxplayer-o localvoice.mp3
Note: you should be able to play sound on VLC connection, too.
You can install alsa to control sound. Make sure alsa-utils is installed and run alsamixer as below:
$ sudo apt-get install -y alsa-utils
$ alsamixer
Then use the F1-F6 keys and UI to push up the volume.
Use the arrow keys to jack up the volume and quit.
To save what you changed in alsamixer as defaults, do:
sudo alsactl store 0