Difference: Lecture7:AccessingTheRealWorld (1 vs. 6)

Revision 62017-11-01 - uli

Line: 1 to 1
 
META TOPICPARENT name="LectureSlides"

Start Presentation

Slide 1: Accessing the Real World

Line: 291 to 291
 

Bit handling functions

We need to learn a few bit handling functions before being able to prepare the data for the DAC:
| : bitwise or
& : bitwise and
data += 5 <=> data = data + 5
data |= 5 <=> data = data | 5
~data: invert all bits in data
data >> 4 all bits in data are shifted right by 4
data << 4 all bits in data are shifted left by 4

Changed:
<
<

---++

>
>

 

Writing data to a DAC

Imagine a 12 bit digital to analogue converter with the following register outline:

Line: 306 to 307
  The medium significant digit to register 1
(RS=01)
Changed:
<
<
And the highest significant digit to register 2
(RS=01)
>
>
And the highest significant digit to register 2
(RS=10)
  To strobe the data into the register the strobe line must see a low to high transition

Revision 52017-10-16 - uli

Line: 1 to 1
 
META TOPICPARENT name="LectureSlides"

Start Presentation

Slide 1: Accessing the Real World

Line: 63 to 63
 in this new functionality it may be merged back into the main branch.

Added:
>
>

Our use of git

We do not want to develop the code but just use it.

In this case we decide, where in our file system tree we want to

install the source code of the library and then we download it with

git clone git://git.drogon.net/wiringPi

This will download the source code which we will have to compile

which is done with ./build. This is a shell script!

Have a look to see if you can understand what it does.

In order to keep the library up to date we go to the wiringPi

directory just created and we type:

git pull

This will update the source code to the latest version

Here is the installation manual of wiringPi.

 

Getting the LED blink program to work

The wiringPi library has included a few example programs to show its use.

Line: 74 to 100
 gpioNumbering.png

Added:
>
>

 

Creating blink.c

As you would expect, wiringPi has its own include file

Line: 131 to 159
 
  • SPI functions
  • Miscellaneous function

Added:
>
>

A bit more on bash scripts

As explained before bash provides it own programming language with

  • Assignments
  • Conditional statements
  • Loops

A bash script to setup the Pis

During the weekend I wanted to install the latest version of the

wiringPi library from git on all 15 Raspberry Pis in the lab.

I needed to

  • Create a file system structure with
    /opt/ucc/micros/raspberry into which I put the wiringPi sources
  • Change its owner to root:ucc such that members of the
    ucc group have access to the files
  • Change the permissions to allow members of the
    ucc group to also write into these directories

A bash script to setup the Pis (2)

  • Download the wiringPi source code into the /opt/ucc/micros/raspberry directory
  • Modify a Makefile in the wiringPi subdirectory
  • Compile the code and install using the build bash script supplied with wiringPi
  • Compile all the examples
  • Create the examples/solutions directory on /opt/ucc
    owned by uccstaff:uccstaff and only readable by this used
  • Transfer the solutions of the exercise associated to this lecture
  • Try out everything

... a lot of work

This is a lot of typing!

The solution: a shell script!

The shell script can only be executed by root because only the
root user can create directories in /opt

How to check if we are root?

A conditional statement in the script!

bashRoot.png

The rest of the script

restScript.png

Loops in bash

You can write

  • for loops
  • while loops
  • until loops
in bash.

Unfortunately I have not enough time to explain the full syntax of bash scripts.

You should have a look in the WEB for more information.

Often bash scripts are used for installations and you should be able

to understand what these scripts are doing before executing them.

Example of an endless loop in bash

loopBash.png

You can also read command line arguments just like you do it in C:

argsBash.png

 

The gpio command

Changed:
<
<
In addition to the library functions a new command:
gpio
is provided. This can be used to set gpio pins from bash
It has however many more options. Look them up in its man page.
>
>
There is the gpio command, which is part of wiringPi.

It has many options. Please have a look at its man page!

One option allows to read and write GPIO pins:

gpio write $PIN $ON_OFF

If PIN is 0 and ON_OFF is 1 then the LED connected to GPIO pin 0 will go on.

A bit more on C programming

We have just seen the very basics of C programming and we need to learn

a bit more about the libraries we can use

Here we will look at

  • String handling functions
  • Some bit handling function
  • Exiting a program gracefully

String handling functions

There is a series of functions to

  • Compare strings strcmp and strncmp
  • Copy strings strcpy and strncpy
  • Locate a sub-string strstr
are the most important important ones.

Treating command line arguments

Consider a wave generator where the user can choose the

type of waveform using command line arguments.

His options are:

  • sine
  • rectangular
  • triangular
  • sawtooth
How can be convert the strings into a variable that can be treated in a switch statement?
---++

First check it the number of arguments is correct

argCountCheck.png

The test and assignment of the wave type

waveTypeTest.png

Bit handling functions

We need to learn a few bit handling functions before being able to prepare the data for the DAC:
| : bitwise or
& : bitwise and
data += 5 <=> data = data + 5
data |= 5 <=> data = data | 5
~data: invert all bits in data
data >> 4 all bits in data are shifted right by 4
data << 4 all bits in data are shifted left by 4

---++

Writing data to a DAC

Imagine a 12 bit digital to analogue converter with the following register outline:

The 12 bit data must be written 4 bits at a time to registers

which are selected by the RS bits.

The lowest significant digit goes to register 0
(both RS bits zero)

The medium significant digit to register 1
(RS=01)

And the highest significant digit to register 2
(RS=01)

To strobe the data into the register the strobe line must see a low to high transition

The DAC

We have a 12 bit DAC, which creates signal levels from 0V to Vcc

What is the max. number this DAC can take in decimal and in hex?

What is the signal resolution in ‰

This is Physics!

Preparing data for the DAC

Remember the bit layout of the DAC register?


We must write the

  • lowest significant,
  • medium significant and
  • highest significant bits
separately.

We must “or” in the register select bits and read/write bits

(write is usually active low)

We must strobe in the data (a pulse on the strobe bit)

DAC preparation

Write a function which prepares a byte for the DAC

The function takes 3 arguments:

  • The data nibble (4 bits of data)
  • The register selection (0,1,2)
  • The read/write bit
Leave the strobe bit zero!

What will be the result if you want to write 5 to register to the middle nibble?

Solution: DAC preparation

sendToHWInclude.png

Now the test program generating data for the DAC

dacPrep.png

Strobe

Now create a strobe function which takes DAC data (including the register bits)

and generates a strobe signal on the

STR line without touching the other bits

With a correctly prepared data and register byte this will

write the data to the correct register within the DAC

Solution: Strobe

strobe.png

Exiting a program gracefully

When we have a program like our blink program,

then the only way to exit the endless loop is a ^C

which will leave the LED in an unknown state.

Is there a way to exit the program gracefully and to

make sure the LED is always off once the program exits?

Yes, there is!

Killing the program

When we kill the program with ^C, a signal (SIGINT) is sent

to it which normally results in a brutal stop of the program.

It is however possible to capture the signal and

do some cleanup before the program finally exits.

Signal handler

signalHandler.png

Catching signals

signal.png

 
%SLIDESHOWEND%

-- Uli Raich - 2017-09-27

Comments

Changed:
<
<
<--/commentPlugin-->
>
>
<--/commentPlugin-->
Preparing data for the DAC
 
META FILEATTACHMENT attachment="gpioNumbering.png" attr="" comment="" date="1506522380" name="gpioNumbering.png" path="gpioNumbering.png" size="161701" user="uli" version="1"
META FILEATTACHMENT attachment="blink.png" attr="" comment="" date="1506522380" name="blink.png" path="blink.png" size="50055" user="uli" version="1"
Line: 149 to 427
 
META FILEATTACHMENT attachment="ssh-X.png" attr="" comment="" date="1506524862" name="ssh-X.png" path="ssh-X.png" size="300537" user="uli" version="1"
META FILEATTACHMENT attachment="blinkMakefile.png" attr="" comment="" date="1506530162" name="blinkMakefile.png" path="blinkMakefile.png" size="6723" user="uli" version="1"
META FILEATTACHMENT attachment="ledschematics.png" attr="" comment="" date="1506530936" name="ledschematics.png" path="ledschematics.png" size="7367" user="uli" version="1"
Added:
>
>
META FILEATTACHMENT attachment="bashRoot.png" attr="" comment="" date="1508152594" name="bashRoot.png" path="bashRoot.png" size="7293" user="uli" version="1"
META FILEATTACHMENT attachment="restScript.png" attr="" comment="" date="1508152595" name="restScript.png" path="restScript.png" size="29128" user="uli" version="1"
META FILEATTACHMENT attachment="loopBash.png" attr="" comment="" date="1508152595" name="loopBash.png" path="loopBash.png" size="5824" user="uli" version="1"
META FILEATTACHMENT attachment="argCountCheck.png" attr="" comment="" date="1508152652" name="argCountCheck.png" path="argCountCheck.png" size="20416" user="uli" version="1"
META FILEATTACHMENT attachment="argsBash.png" attr="" comment="" date="1508152652" name="argsBash.png" path="argsBash.png" size="9219" user="uli" version="1"
META FILEATTACHMENT attachment="signal.png" attr="" comment="" date="1508152652" name="signal.png" path="signal.png" size="19505" user="uli" version="1"
META FILEATTACHMENT attachment="signalHandler.png" attr="" comment="" date="1508152653" name="signalHandler.png" path="signalHandler.png" size="24970" user="uli" version="1"
META FILEATTACHMENT attachment="enum.png" attr="" comment="" date="1508152778" name="enum.png" path="enum.png" size="20456" user="uli" version="1"
META FILEATTACHMENT attachment="waveTypeTest.png" attr="" comment="" date="1508152778" name="waveTypeTest.png" path="waveTypeTest.png" size="33580" user="uli" version="1"
META FILEATTACHMENT attachment="strobe.png" attr="" comment="" date="1508155863" name="strobe.png" path="strobe.png" size="46229" user="uli" version="1"
META FILEATTACHMENT attachment="dacPrep.png" attr="" comment="" date="1508156316" name="dacPrep.png" path="dacPrep.png" size="42958" user="uli" version="1"
META FILEATTACHMENT attachment="sendToHWInclude.png" attr="" comment="" date="1508155863" name="sendToHWInclude.png" path="sendToHWInclude.png" size="29093" user="uli" version="1"
META FILEATTACHMENT attachment="sendToDAC.png" attr="" comment="" date="1508155863" name="sendToDAC.png" path="sendToDAC.png" size="30373" user="uli" version="1"
META FILEATTACHMENT attachment="lecture_7.odp" attr="" comment="" date="1508157461" name="lecture_7.odp" path="lecture_7.odp" size="561204" user="uli" version="1"

Revision 42017-10-16 - uli

Line: 1 to 1
 
META TOPICPARENT name="LectureSlides"

Start Presentation

Slide 1: Accessing the Real World

Lecture 7


Uli Raich


UCC semester 2017/2018

Deleted:
<
<

Accessing the RPI remotely

 
Deleted:
<
<
Of course we can use the interfaces on the Raspberry Pi

to connect a screen, keyboard and mouse and use it

in stand-alone mode but we can also make use

of the PC resources and access it remotely.


There are several ways to access the RPI remotely:

  • Using the VNC server on the Pi you can access
    it with a remote desktop from the PC
  • The secure shell (ssh) allows you to get a remote terminal in the Pi
    With scp you can copy files back and forth between the Pi and the PC
  • With nfs you can mount part of the Pi file system into the
    PC file system tree and access the PI SD card as if it was a local PC disk.

The remote Desktop

piRemoteDesktop.png

Remote Desktop (2)

When running the remote desktop you are working on the Raspberry Pi

with the screen, keyboard and mouse replaced by the devices on the PC.

You have the same functionality as if the screen was connected

to the Pi’s HDMI port and keyboard and mouse were connected

to the USB ports on the Pi.

nfs the network file system

With nfs you can mount part of the Pi’s file system tree

onto your PC file system.

This allows you access to the Pi’s files as if you were

using a local disk. You cannot run any Rasberry Pi

programs this way however.

It is interesting if you cross-compile Pi programs on your PC,

which will be immediately visible on the Pi.

ssh the secure shell

In the case of ssh you have a single terminal window

that is connected to a shell on the Pi.

The command is:

ssh userOnPi@piIPaddress

Where piIPaddress can be the Pi’s IP address of hostname.


If you specify the -X option you can run X-11 based programs

where the X protocol is run over the ssh connection.

ssh session example

Here you see a screen dump from the PC with a remote terminal

that started an emacs session on the Pi.

ssh-X.png

scp

To copy a file from the PC to the Pi this would be the command:

scp myfile.c uli@raspberry10:exercises/solutions/exercise_2


This will copy the file “myfile.c” into the sub-directory

exercises/solutions/exercise_2 on my home directory on the Pi.

Of course user uli must exist on raspberry10.

Instead of specifying the machine name:

raspberry10 you can also give its IP address.

Compiling C programs for the Raspberry Pi

Just like Linux on the PC, Linux on the Raspberry Pi uses the GNU C compiler gcc.

The

  • front end:
  • Lexical Analyzer
  • and the parser for the grammar
are the same.


However, the code generator is different since now we compile

for the ARM processor and not the Intel processor used on the PC

Cross-Compilation for the Pi

As explained in a previous lecture we can also compile

C programs for the Raspberry Pi on the PC Linux

system using a cross-compiler.

The cross compiler we will use is named

arm-linux-gnueabihf-gcc

and it is part of the tools package for the Pi.

 

Access libraries

As we have already seen, the Raspberry Pi flat cable connector

Revision 32017-09-27 - uli

Line: 1 to 1
 
META TOPICPARENT name="LectureSlides"

Start Presentation

Slide 1: Accessing the Real World

Lecture 7


Uli Raich


UCC semester 2017/2018

Changed:
<
<
%SLIDESHOWEND%
>
>

Accessing the RPI remotely

 
Changed:
<
<
-- Uli Raich - 2017-09-27
>
>
Of course we can use the interfaces on the Raspberry Pi

to connect a screen, keyboard and mouse and use it

in stand-alone mode but we can also make use

of the PC resources and access it remotely.


There are several ways to access the RPI remotely:

  • Using the VNC server on the Pi you can access
    it with a remote desktop from the PC
  • The secure shell (ssh) allows you to get a remote terminal in the Pi
    With scp you can copy files back and forth between the Pi and the PC
  • With nfs you can mount part of the Pi file system into the
    PC file system tree and access the PI SD card as if it was a local PC disk.

The remote Desktop

piRemoteDesktop.png

Remote Desktop (2)

When running the remote desktop you are working on the Raspberry Pi

with the screen, keyboard and mouse replaced by the devices on the PC.

You have the same functionality as if the screen was connected

to the Pi’s HDMI port and keyboard and mouse were connected

to the USB ports on the Pi.

nfs the network file system

With nfs you can mount part of the Pi’s file system tree

onto your PC file system.

This allows you access to the Pi’s files as if you were

using a local disk. You cannot run any Rasberry Pi

programs this way however.

It is interesting if you cross-compile Pi programs on your PC,

which will be immediately visible on the Pi.

ssh the secure shell

In the case of ssh you have a single terminal window

that is connected to a shell on the Pi.

The command is:

ssh userOnPi@piIPaddress

Where piIPaddress can be the Pi’s IP address of hostname.


If you specify the -X option you can run X-11 based programs

where the X protocol is run over the ssh connection.

ssh session example

Here you see a screen dump from the PC with a remote terminal

that started an emacs session on the Pi.

ssh-X.png

scp

To copy a file from the PC to the Pi this would be the command:

scp myfile.c uli@raspberry10:exercises/solutions/exercise_2


This will copy the file “myfile.c” into the sub-directory

exercises/solutions/exercise_2 on my home directory on the Pi.

Of course user uli must exist on raspberry10.

Instead of specifying the machine name:

raspberry10 you can also give its IP address.

Compiling C programs for the Raspberry Pi

Just like Linux on the PC, Linux on the Raspberry Pi uses the GNU C compiler gcc.

The

  • front end:
  • Lexical Analyzer
  • and the parser for the grammar
are the same.


However, the code generator is different since now we compile

for the ARM processor and not the Intel processor used on the PC

Cross-Compilation for the Pi

As explained in a previous lecture we can also compile

C programs for the Raspberry Pi on the PC Linux

system using a cross-compiler.

The cross compiler we will use is named

arm-linux-gnueabihf-gcc

and it is part of the tools package for the Pi.

 
Added:
>
>

Access libraries

As we have already seen, the Raspberry Pi flat cable connector

and the cobbler + bread board, give access to external hardware though

  • gpio
  • I2C bus
  • SPI
  • serial port interface
Dedicated interfaces to camera and display

Software access

Of course you can access the external hardware through

the BCM-2837 interfaces and their registers directly, however,

this is not for the faint-hearted (read the 200 page manual first!)

The easier way to access these devices are ready made

libraries giving you a simpler API for access

To my knowledge there are 2 such libraries around

(at least these are the most popular ones):

How to download and install

Both libraries can be downloaded as git source archives,

which allows you to have the very latest version and

to keep your version up to date.

git is a revision control system allowing many developers

to work on the same project. You check out the current version,

work on it and you can upload to the git server

the modifications you made.

You can also create a new code branch where you implement

new functionality which may be specific to what you want

to use the code for, or it may be a try to implement new options

which may later be discarded or, in case everybody is interested

in this new functionality it may be merged back into the main branch.

Getting the LED blink program to work

The wiringPi library has included a few example programs to show its use.

The most simple one is a program making a LED blink.

WiringPi has its own numbering system for the GPIO pins:

gpioNumbering.png

Creating blink.c

As you would expect, wiringPi has its own include file

which you must use in order to access the library:

#include <wiringPi.h>

On our systems we have installed this include file is in /usr/include

on the Pi file system while the library itself is in /usr/lib

As these are the standard positions for include files and libraries on a

Linux system all we have to do in the Makefile is to add

-lwiringPi to the LDLIBS macro.

The C code of blink.c

blink.png

The Makefile to build blink

blinkMakefile.png

Ohm's law

If you consider that the LED has no resistance and the Raspberry Pi

drives the GPIO pins with 3.3V and you connect as shown in the circuit diagram,

then what is the current flowing through the LED?

ledschematics.png

WiringPi functions

The library has functions to

  • Setup and initialize the library
    This will open the needed device drivers and give access to them
  • Core functions: Functions to
    • set gpio pins to input or output and
    • to read and write from /to them
    • define pull-ups/pull-downs
  • Some Pi specific functions liking getting the version no
  • Timing functions (e.g. delays)

WiringPi functions (2)

  • Priority, interrupts, threads
  • I2C bus functions
  • Serial line functions
  • SPI functions
  • Miscellaneous function

The gpio command

In addition to the library functions a new command:
gpio
is provided. This can be used to set gpio pins from bash
It has however many more options. Look them up in its man page.


%SLIDESHOWEND%

-- Uli Raich - 2017-09-27

 

Comments

<--/commentPlugin-->
\ No newline at end of file
Added:
>
>
META FILEATTACHMENT attachment="gpioNumbering.png" attr="" comment="" date="1506522380" name="gpioNumbering.png" path="gpioNumbering.png" size="161701" user="uli" version="1"
META FILEATTACHMENT attachment="blink.png" attr="" comment="" date="1506522380" name="blink.png" path="blink.png" size="50055" user="uli" version="1"
META FILEATTACHMENT attachment="reminna.png" attr="" comment="" date="1506524006" name="reminna.png" path="reminna.png" size="4028" user="uli" version="1"
META FILEATTACHMENT attachment="piRemoteDesktop.png" attr="" comment="" date="1506524007" name="piRemoteDesktop.png" path="piRemoteDesktop.png" size="387840" user="uli" version="1"
META FILEATTACHMENT attachment="ssh-X.png" attr="" comment="" date="1506524862" name="ssh-X.png" path="ssh-X.png" size="300537" user="uli" version="1"
META FILEATTACHMENT attachment="blinkMakefile.png" attr="" comment="" date="1506530162" name="blinkMakefile.png" path="blinkMakefile.png" size="6723" user="uli" version="1"
META FILEATTACHMENT attachment="ledschematics.png" attr="" comment="" date="1506530936" name="ledschematics.png" path="ledschematics.png" size="7367" user="uli" version="1"

Revision 22017-09-27 - uli

Line: 1 to 1
 
META TOPICPARENT name="LectureSlides"

Start Presentation

Slide 1: Accessing the Real World

Revision 12017-09-27 - uli

Line: 1 to 1
Added:
>
>
META TOPICPARENT name="LectureSlides"

Start Presentation

Slide 1: Accessing the Real World

Lecture 7


Uli Raich


UCC semester 2017/2018

-- Uli Raich - 2017-09-27

Comments

<--/commentPlugin-->
 
This site is powered by the TWiki collaboration platform Powered by PerlCopyright © 2008-2024 by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TWiki? Send feedback