-
Notifications
You must be signed in to change notification settings - Fork 7
AgPi: Agents on Raspberry Pi
Tushar Semwal edited this page Oct 16, 2017
·
21 revisions
WiringPi is a C library which provides APIs to access the GPIO pins and other peripherals of Raspberry Pi. Thanks to the efforts of Midhul Verma and Nikhil Teja Alamanda, a WiringPi-Prolog wrapper was created as a part of the AgPi project. Through this wrapper, Tartarus agents can access the different peripherals of a Raspberry Pi and hence, transcended its predecessors.
WiringPi-Prolog wrapper source code is maintained here.
- Install the latest version of Raspbian on Raspberry Pi. The OS can be downloaded from the following link .
- Install swi-prolog on the system (as root user) using the command:
% sudo apt-get install swi-prolog
- Download/Copy the WiringPi-Prolog tar file (provided here) onto the Raspberry pi.
- Unzip the WiringPi-Prolog zip file using the command:
$ unzip <file_name>
- Check the swi-prolog installation directory. Generally the location is ‘/usr/lib/swi-prolog’. To check otherwise use the following commands:
$ swipl
?- file_search_path(swi, X).
- Copy the wipi folder from the unzipped folder (step 4) to the folder returned in step 5.
- Get out of superuser if still in it.
- Go to your working directory (the folder where you will be working with your project files).
- Copy the ‘platform_pi.pl’ (provided here) file in this directory.
- Now start prolog with sudo permission (very important):
$ sudo swipl
- Consult the
platform_pi.pl
using:?- consult('platform_pi.pl').
This will load all of the Tartarus predicates. - Execute the command:
?- start_peripherals.
This will start the Peripheral Interface. Make sure no errors occur during this step. - Now the peripheral interface is ready, and you can use WiringPi Prolog predicates to control the GPIO pins.
Since AgPi is a wrapper over WiringPi, the commands used in WiringPi are same as in AgPi but just comes with a flavor of Prolog.
The arguments passed to a predicate can take three forms - Input, Output or Both, and are denoted by symbols +, - and ? respectively.
- Set the mode of a pin to input or output using the
pinMode
command:
Syntax:pinMode(+Pin,+Mode)
- Pin: GPIO pin number according to WiringPi.
- Mode: INPUT (0) or OUTPUT (1) mode.
- Use
digitalRead
command to read the input of a particular pin.
Syntax:digitalRead(+Pin,-ValueReturned)
- Pin: GPIO pin number according to WiringPi.
- ValueReturned: Returns a value - either HIGH (1) or LOW (0) for the pin.
- Use
digitalWrite
command to write a value to the particular pin.
Syntax:digitalWrite(+Pin,+Value)
- Pin: GPIO pin number according to WiringPi.
- ValueReturned: set value HIGH (1) or LOW (0) for the pin.
Example for LED:
- Connect positive of led to GPIO pin 1(see WiringPi pin mapping) along with a resistance in series.
- Connect negative of led to GPIO pin 0(see WiringPi pin mapping).
- Write the following code to light up the LED:
?- pinMode(0,0).
--set pinmode of pin 0 to 0 for output.?- pinMode(1,0).
--set pinmode of pin 1 to 0 for output.?- digitalWrite(0,0).
--set value of pin 0 to 0 for LOW/ground.?- digitalWrite(1,1).
--set value of pin 1 to 1 for HIGH/(3.3v). - This will light up the LED.
- To turn it off use the command
digitalWrite(1,0)
to write value 0 to pin 1.
- Connect the I2C device to the Raspberry Pi.
- Check if the device is connected properly using the command:
$ sudo i2cdetect -y 1
It should show something like:
- The address of the I2C device that we interact with is the one that appears on the table in the above image.
- The commands that can be used to interact with the I2C device are:
-
wiringPiI2CSetup(addr,Fd): To setup a connection with the device.
- Addr: The address of the device obtained in step 2. Example: 0x68 (refer image in step 2).
- Fd: The value returned by the setup command for furthur referencing to the device. -
wiringPiI2CWriteReg8(Fd,reg,val): To write a value in a particular register on the device.
- Fd: The value of Fd obtained from the setup command.
- reg: Address of the register to which the value is to be written.
- val: The value to be written to the particular register (reg). Note: wiringPiI2CWriteReg16(Fd,reg,Val) is also available -
wiringPiI2CReadReg8(Fd,reg,Val): To read the output from a particular register on the device.
- Fd: The value of Fd obtained from the setup command.
- reg: Address of the register from which the value is to be read.
- Val: The value stored in the register returned by the command. Note: wiringPiI2CReadReg16(Fd,reg,Val) is also available
Example for IMU:
- Follow the first three steps of I2C to connect the IMU to Raspberry pi.
- Now once we get the address we type the following commands:
?- wiringPiI2CSetup(0x68, Fd).
--returns the value of Fd(4 in this case) to be used in later commands.?- wiringPiI2CWriteReg8(4,0x6b,0x00).
--sets a value to particular registers (refer to IMU datasheet) to awaken the device.?- wiringPiI2CWriteReg8(4,0x6c,0x00).
--sets a value to particular registers to awaken the device.?- wiringPiI2CWriteReg8(4,0x74,0x00).
--sets a value to particular registers to awaken the device.?- wiringPiI2CReadReg8(4,0x43,T).
--returns the value of stored in 0x43 register.
-
wiringPiI2CSetup(addr,Fd): To setup a connection with the device.