Showing posts with label Raspberry Pi. Show all posts
Showing posts with label Raspberry Pi. Show all posts

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

Tuesday, July 7, 2015

To install a particular OS image

Second we wll see to install a particular Operating System Image,


1.     Download Official images for recommended Operating System Eg - Raspbian.
2.    unzip it to get the image file (.img) for writing to your SD card.
3.     We need to use an image writing tool to install it on your SD card.
4.    So download the "win32 disk imager".
5.     Insert the SD card into the laptop/pc and run the image writer. Once open, browse and select the downloaded Raspbian image file. Select the correct device, that is the drive representing the SD card.
6.     click on the "Write" button.
7.     Once the write is complete, eject the SD card and insert it into the Raspberry Pi and turn it on.
8. Setting up the Pi            
                 after booting the Pi, there will be asked for username and password. So use default username and password.
When the Pi has been booted for the first time, a configuration screen "Setup Options" will appear. 

If you didn’t get "Setup Options" screen, then type "sudo raspi-config".

  • Select the first option ( "Expand Filesystem") in the list of the setup options window, and hit the enter key. We do this to make use of all the space present on the SD card as a full partition. All this does is, expand the OS to fit the whole space on the SD card which can then be used as the storage memory for the Pi.
  • Select the third option ("Enable Boot To Desktop/Scratch") in the list of the setup options window and hit the enter key. It will take to "choose boot option" window.
    In the "choose boot option window" , select the second option( "Desktop Log in as user 'pi' at the graphical desktop") and hit the enter button. We do this because we want to boot into the desktop environment which we are familiar with. If we don't do this step then the Raspberry Pi boots into a terminal each time with no GUI options.
     
  •  Select the "finish" button and it should reboot automatically. If it is not type “sudo reboot”  
 9.   Updating firmware
       After the previous step, if everything went right, then you will end up on the desktop which looks like below image.
Then open a terminal and enter “sudo rpi-update” command to update the firmware of the Pi.