Sunday, November 22, 2015

Run Python script in the background as a service in raspberry pi on boot

This is a simple service in Python and need it to start running in the background when the Raspberry Pi boots. Here Python script receive udp data in real time. The following init script makes getting a Python script (or e.g. a Perl script) to run when the Raspberry Pi boots fairly painless. Services are supposed to run as "daemons" which is quite complicated in Python. We use start-stop-daemon command to run our script in the background and basically deals with everything we need.

This is init file save it as myservice.sh at
 /etc/init.d   


 #!/bin/sh 
 ### BEGIN INIT INFO 
 # Provides:     myservice 
 # Required-Start:  $remote_fs $syslog 
 # Required-Stop:   $remote_fs $syslog 
 # Default-Start:   2 3 4 5 
 # Default-Stop:   0 1 6 
 # Short-Description: Put a short description of the service here 
 # Description:    Put a long description of the service here 
 ### END INIT INFO 
 # Change the next 3 lines to suit where you install your script and what you want to call it 
 DIR=/usr/local/bin/myservice 
 DAEMON=$DIR/myservice.py 
 DAEMON_NAME=myservice 
 # Add any command line options for your daemon here 
 DAEMON_OPTS="" 
 # This next line determines what user the script runs as. 
 # Root generally not recommended but necessary if you are using the Raspberry Pi GPIO from Python. 
 DAEMON_USER=root 
 # The process ID of the script when it runs is stored here: 
 PIDFILE=/var/run/$DAEMON_NAME.pid 
 . /lib/lsb/init-functions 
 do_start () { 
   log_daemon_msg "Starting system $DAEMON_NAME daemon" 
   start-stop-daemon --start --background --pidfile $PIDFILE --make-pidfile --user $DAEMON_USER --chuid $DAEMON_USER --startas $DAEMON -- $DAEMON_OPTS 
   log_end_msg $? 
 } 
 do_stop () { 
   log_daemon_msg "Stopping system $DAEMON_NAME daemon" 
   start-stop-daemon --stop --pidfile $PIDFILE --retry 10 
   log_end_msg $? 
 } 
 case "$1" in 
   start|stop) 
     do_${1} 
     ;; 
   restart|reload|force-reload) 
     do_stop 
     do_start 
     ;; 
   status) 
     status_of_proc "$DAEMON_NAME" "$DAEMON" && exit 0 || exit $? 
     ;; 
   *) 
     echo "Usage: /etc/init.d/$DAEMON_NAME {start|stop|restart|status}" 
     exit 1 
     ;; 
 esac 
 exit 0 

Then create myservice.py file at /usr/local/bin/myservice . and also create output.txt file in the same directory. change permission by chmod 777 myservice.py


 import sys, struct  
 from socket import *  
 SIZE = 1024   # packet size  
 hostName = gethostbyname('0.0.0.0')  
 mySocket = socket( AF_INET, SOCK_DGRAM )  
 mySocket.bind((hostName,18736))  
 repeat = True  
 while repeat:  
   (data,addr) = mySocket.recvfrom(SIZE)  
   data = struct.unpack('d',data)  
   data=int(data[0])  
   file = open("output.txt", "w")  
   file.write(str(data))  
   file.close()  
To run this when raspberry pi boot
 sudo nano /etc/rc.local  
:

then add bellow line before exit line in rc.local 
 sudo /etc/init.d/myservice.sh start  



you can also manually start your Python script using the command
 sudo /etc/init.d/myservice.sh start  

check its status with the
 sudo /etc/init.d/myservice.sh status  

stop it with
 sudo /etc/init.d/myservice.sh stop   

Saturday, November 21, 2015

Run script at boot as service

This is achieved using the init run-level based rc scripts. Basically the command "service" used to start and stop system services. for example "service <your script> start".

  # update boot / reboot files   
sudo cp &lt;your script&gt; /etc/init.d/ # &lt;your script&gt; your script file with the path
# do it as soon as the device is going down,
# both for shutdown and reboot
sudo chmod u+x &lt;your script&gt;
sudo update-rc.d /etc/init.d/&lt;your script&gt; defaults
The <your script> is : 

   #! /bin/sh   
### BEGIN INIT INFO
# Provides: &lt;your script name&gt;
# Required-Start: $all
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Manage my cool stuff
### END INIT INFO
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/bin
. /lib/init/vars.sh
. /lib/lsb/init-functions
# If you need to source some other scripts, do it here
case "$1" in
start)
log_begin_msg "Starting my super cool service"
# do something
log_end_msg $?
exit 0
;;
stop)
log_begin_msg "Stopping the coolest service ever unfortunately"
# do something to kill the service or cleanup or nothing
log_end_msg $?
exit 0
;;
*)
echo "Usage: /etc/init.d/&lt;your script&gt; {start|stop}"
exit 1
;;
esac

Then replace # do something with the content of your original script. for example : 
 
 sudo service hostapd stop  
sudo service udhcpd stop
sudo service hostapd start
sudo service udhcpd start

Saturday, November 14, 2015

Simulink with Matlab

In the MATLAB command window enter the command               
                    
            >> simulink
The alternate method is to click the Simulink icon in the MATLAB toolbar

  A Simulink library window will pop up as shown below :


Introduction to Simulink in MATLAB

Simulink (Simulation and link) is developed by MathWorks as an add-on with MATLAB. It is a graphical programming language which offers modelling, simulation and analyzing of multi domain dynamic systems under Graphical User Interface (GUI) environment. The Simulink have tight integration with the MATLAB environment and have a comprehensive block libraries and toolboxes for linear and nonlinear analyses. The system models can be so easily constructed via just click and drag operations. The Simulink comes handy while dealing with control theory and model based design.

Thursday, November 5, 2015

Receive data from a Simulink's built-in "UDP Send" block in python

 import sys, struct  
import time
from socket import *
SIZE = 1024 # packet size
hostName = gethostbyname('0.0.0.0')
mySocket = socket(AF_INET,SOCK_DGRAM)
mySocket.bind((hostName,18726))
repeat = True
while repeat:
(data,addr) = mySocket.recvfrom(SIZE)
data = struct.unpack('d',data)
print int(data[0])

List no of bluetooth devices that are connected to raspberry pi

 import bluetooth  
print("performing inquiry...")
nearby_devices = bluetooth.discover_devices(lookup_names = True)
print("found %d devices" % len(nearby_devices))
for addr, name in nearby_devices:
print(" %s - %s" % (addr, name))

Check availability of a device via bluetooth in raspberry pi

 #!/usr/bin/python  
import bluetooth
import time
while True:
print "Checking " + time.strftime("%a, %d %b %Y %H:%M:%S", time.gmtime())
result = bluetooth.lookup_name('1C:66:AA:CF:DD:35', timeout=5)
if (result != None):
print "Available"
else:
print "Not Available"
time.sleep(60)

Audio Slicing in python

Divide the audio file into no of sample by time interval and then play.


 import wave  
import pygame
import time
import sys
def slice(infile, outfilename, start_ms, end_ms):
width = infile.getsampwidth() #Returns sample width in bytes
rate = infile.getframerate() #Returns sampling frequency
fpms = rate / 1000 # frames per ms
length = (end_ms - start_ms) * fpms
start_index = start_ms * fpms
out = wave.open(outfilename, "w")
out.setparams((infile.getnchannels(), width, rate, length, infile.getcomptype(), infile.getcompname()))
infile.rewind() #Rewind the file pointer to the beginning of the audio stream
anchor = infile.tell() #Return current file pointer position
infile.setpos(anchor + start_index) #Set the file pointer to the specified position
out.writeframes(infile.readframes(length)) #Write audio frames and make sure nframes is correct
if __name__ == "__main__":
slice(wave.open("song1.wav", "r"), "out.wav", int(sys.argv[1]), int(sys.argv[2]))
pygame.mixer.init()
pygame.mixer.music.load("out.wav")
pygame.mixer.music.play()
while pygame.mixer.music.get_busy() == True:
continue

Sunday, October 18, 2015

Set up MATLAB and Simulink support package for Raspberry Pi



Select the installation option. There are two ways to do this:
  • Either in the Command window of MATLAB, type supportPackageInstaller 
  • Or you can choose on the MATLAB menu item, "Get Hardware Support Packages".






Start Support Package Installer
Click on Get Hardware Support Packages in the drop down menu to start the installer. Select 'Install from Internet' as the source for installing the support package.
 


Select Raspberry Pi from a list of support packages
Click Next to see a list of support packages and select Raspberry Pi from the list to install both the support packages at once. Hold SHIFT to choose two options.
 
MathWorks Account
Click next and log in to your MathWorks account. 
 

Continue and Complete the Installation
Accept the license agreement on the next screen and click Next through the following screens to finish the installation of both MATLAB and Simulink Support Package for Raspberry Pi. 
 

Firmware Update
Click Next and on the Firmware Update page select the appropriate board .
 

Configure Network
Click Next and in the configure network screen, select Direct connection to host computer. The picture in the MATLAB window shows the network configuration later used, so don't connect Raspberry Pi to your PC at this time.
 

Select the drive
In the next window 'Select a drive', the MicroSD cards that are detected by MATLAB will show up in a list format.
If the MicroSD memory card does not get detected by MATLAB, but is detected by the OS - close MATLAB and restart MATLAB as an administrator. To continue with the process, the targetupdatercommand can be used in MATLAB.
 

Write firmware
In the next window, select write option to erase existing items on the memory card and flash the latest firmware that is needed by the Support package.