======PROJECT======
PROJECT: Input With Buttons (iwb1)
=====Objective=====
In the ledX electronics projects, we played exclusively with output components, in the form of LEDs. Here, we continue our use of the button, further enhancing the functionality of the input in the overall process:
* four LEDs (just like in led1)
* two buttons (one to increment the count, one to decrement the count)
=====Abstraction=====
{{page>haas:fall2021:common:projects:abstraction&noheader}}
=====Locational Awareness=====
{{page>haas:fall2021:common:projects:location&noheader}}
=====Reading=====
Please be sure to familiarize yourself with the following content in "[[https://publications.gbdirect.co.uk//c_book/|the C book]]":
* [[https://publications.gbdirect.co.uk//c_book/chapter7/|Chapter 7]]
Also, some background information on buttons:
* https://learn.sparkfun.com/tutorials/button-and-switch-basics/all
=====Background=====
For this project, you will be working with a C program using the wiringPi library on the Raspberry Pi, wiring up a circuit containing multiple LEDs and a button to your breadboard and witnessing your ability to access and control them via software.
=====Input and Output via the GPIO pins on the pi=====
One of the intended uses of the Raspberry Pi and other small, single board computers is as an interface tool to peripherals in projects, personal and industrial.
The pi has a set of **General Purpose Input Output** (GPIO) pins intended for precisely this purpose:
{{ :haas:fall2020:common:projects:gpio-pinout-diagram-2.png |}}
Please note the orientation of the pi (ethernet/USB at bottom) to calibrate yourself to the location of pin 1 and all subsequent pins, along with their identified function (ie top left pin, pin 1, provides a constant 3.3v DC power)
We can also get a live update on the state of each pin on our pi itself, using the '**gpio readall**' command at our pi prompt:
yourpi:~/src/SEMESTER/DESIG/iwb1$ gpio readall
+-----+-----+---------+------+---+---Pi 4B--+---+------+---------+-----+-----+
| BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |
+-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
| | | 3.3v | | | 1 || 2 | | | 5v | | |
| 2 | 8 | SDA.1 | ALT0 | 1 | 3 || 4 | | | 5v | | |
| 3 | 9 | SCL.1 | ALT0 | 1 | 5 || 6 | | | 0v | | |
| 4 | 7 | GPIO. 7 | IN | 0 | 7 || 8 | 1 | ALT5 | TxD | 15 | 14 |
| | | 0v | | | 9 || 10 | 1 | ALT5 | RxD | 16 | 15 |
| 17 | 0 | GPIO. 0 | IN | 0 | 11 || 12 | 0 | IN | GPIO. 1 | 1 | 18 |
| 27 | 2 | GPIO. 2 | IN | 0 | 13 || 14 | | | 0v | | |
| 22 | 3 | GPIO. 3 | IN | 0 | 15 || 16 | 0 | IN | GPIO. 4 | 4 | 23 |
| | | 3.3v | | | 17 || 18 | 0 | IN | GPIO. 5 | 5 | 24 |
| 10 | 12 | MOSI | IN | 0 | 19 || 20 | | | 0v | | |
| 9 | 13 | MISO | IN | 0 | 21 || 22 | 0 | IN | GPIO. 6 | 6 | 25 |
| 11 | 14 | SCLK | IN | 0 | 23 || 24 | 1 | IN | CE0 | 10 | 8 |
| | | 0v | | | 25 || 26 | 1 | IN | CE1 | 11 | 7 |
| 0 | 30 | SDA.0 | IN | 1 | 27 || 28 | 1 | IN | SCL.0 | 31 | 1 |
| 5 | 21 | GPIO.21 | IN | 1 | 29 || 30 | | | 0v | | |
| 6 | 22 | GPIO.22 | IN | 1 | 31 || 32 | 0 | IN | GPIO.26 | 26 | 12 |
| 13 | 23 | GPIO.23 | IN | 0 | 33 || 34 | | | 0v | | |
| 19 | 24 | GPIO.24 | IN | 0 | 35 || 36 | 0 | IN | GPIO.27 | 27 | 16 |
| 26 | 25 | GPIO.25 | IN | 0 | 37 || 38 | 0 | IN | GPIO.28 | 28 | 20 |
| | | 0v | | | 39 || 40 | 0 | IN | GPIO.29 | 29 | 21 |
+-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
| BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |
+-----+-----+---------+------+---+---Pi 4B--+---+------+---------+-----+-----+
Yes, it may be packed with information, but it is an informative, technical reference.
Why is this so layered and directed, you may ask? Well, it is a matter of competing standards (approaches to identification of each pin, based on particular reference points).
For example, the "Physical" columns (dead center) in the center conform to the image diagram I posted above of the 40 pins (where pin 1 is the top-left).
The "BCM" columns (far left and far right) refer to the hardware identifications for each pin by the manufacturer. You might notice that BCM pin 17 (physical pin 11) corresponds to wPi pin 0.
And the "wPi" columns (second from left, and second from right), correspond to the pin identifications as use by the wiringPi library, which we are using here.
Additionally, we see "Mode" and "V" columns; mode informs us of the operating mode of that pin at present configuration (IN means it is configured for INPUT, OUT means it is configured for OUTPUT). V implies voltage on the pin (0 means no voltage, 1 means there is voltage present at time of checking). For this project, we will be configuring a specific pin to OUTPUT mode, and modulating it between a state of ON (1) and OFF (0).
So, in exploring the use of the table: if we wanted to hook a component up to wiringPi pin #0, that corresponds to manufacturer (BCM) pin 17, which is physical pin 11.
You will want to verify placement before supplying power, that is why we are taking things slow, and providing you opportunities to confirm (by posting pictures in the discord channel) before proceeding.
It may seem a bit bewildering or overwhelming at first, but like anything, time and exposure will ensure it becomes increasingly second nature.
=====Wiring up our circuit=====
This circuit is basically an enhancement upon the one you made for the led1 project. So the parts needed has some similar items, but also some new ones.
In this project, we will be hooking up two different peripherals to some of our Raspberry Pi pins: a set of light emitting diodes (LED) and buttons, and then proceed to interface with them to access and control their state (each one in some combination of being ON or OFF).
You have likely encountered LEDs endlessly in your everyday life: commonly used as a "power light", which when lit, indicates the device is powered on, among many, MANY, **MANY** other applications.
You have also encountered buttons seemingly in just as ubiquitous a fashion: a button is essentially a switch, toggling something ON or OFF. A light switch is a prime example of this (although in our case, our button doesn't remain in the changed state- once we release it, like a keyboard key, it reverts to its default state).
For this endeavour, you will need to obtain the following items out of the electronics kit you obtained for the class:
{{ :haas:fall2021:common:projects:iwb1partslist.png |}}
=====The Circuit to Construct=====
With those components, you will want to place them onto your breadboard, in a manner similar to previous week's circuits (namely, a combination of led1 and iwb0), but obviously with something different going on.
Of particular note: if you study the iwb0 circuit, you will see that the LED and the button share a common ground: the LED is NOT hooked to the button! That interaction is performed in software.
Included here again is the **iwb0** circuit, for reference:
{{ :haas:fall2020:common:projects:iwb0circuit.png |}}
Likewise here, you will want to EXPAND your breadboard circuit to support FOUR LEDs and the ONE button, then in software, configure the desired functionality.
Take note of how everything is being plugged in, and what connection on the T-cobbler is being utilized.
Pay attention to the color bands of the resistors! We are using two different kinds on this project, and mixing them up will result in erratic or nonfunctional results!
Before you seek to actually test your circuit, please get verification to proceed from the class channel on discord by posting a clear picture of everything (a focus on a clear view of the wires, and where they plug into the breadboard). There are MANY parts, and especially as we have our first exposure, it is best to insert as many quality control checks as possible to ensure the greatest chances of mistakes are mitigated.
=====Program=====
It is your task to compile, run, and understand a program to interface with the LEDs (light emitting diodes) and button. The buttons provide **input** into the mix, instead of just generating output (ie adjusting the state of the LED).
The provided source code (via grabit) is set up to provide the infrastructure to support both the LEDs and the buttons for this project. While you have to determine where they interface, the code will initialize the pins as appropriate. Your main task is to:
* implement a program that counts 4 LEDs in the direction input specifies
* if one button is pressed, increment the count from the current value to 15, rolling over to 0 as needed
* if the other button is pressed, decrement the count from the current value to 0, rolling over to 15 as needed
* have a 50mS - 500mS delay between state changes
* pressing the button enables the change for that next state (after the current delay expires)
* implement support for FOUR LEDs
* each LED connected to a unique GPIO line
* implement support for TWO buttons
* adapt the program to "act" on button presses. That is, it only proceeds from one step to the next when you press a button.
====Grabbing project resources (on lab46)====
I have prepared a **grabit** for resources related to this project. To obtain:
lab46:~/src/SEMESTER/DESIG$ grabit desig iwb1
make: Entering directory '/var/public/SEMESTER/DESIG/iwb1'
'/var/public/SEMESTER/DESIG/iwb1/Makefile' -> '/home/user/src/SEMESTER/DESIG/iwb1/Makefile'
'/var/public/SEMESTER/DESIG/iwb1/iwb1.c' -> '/home/user/src/SEMESTER/DESIG/iwb1/iwb1.c'
make: Leaving directory '/var/public/SEMESTER/DESIG/iwb1'
lab46:~/src/SEMESTER/DESIG$
At which point you can change into the newly created and populated **iwb1/** directory.
====Getting project resources from lab46 to your pi====
Okay, you've snagged the project files on lab46. Now, how to get them to your pi?
The same way you've been juggling project files already, by using your mercurial repository!
Using the **hg** tool, be sure to **add**, **commit**, and **push** successfully on lab46.
Then, over on your pi, use **hg** to **pull** and **update** the new changes into place. Then you can proceed.
====On your pi====
Study and run this program on your pi in conjunction with testing and verifying operation of your properly hooked up electronics circuit. When done, submit it on lab46.
To utilize the needed functionality for this project, you will need to ensure you have the following packages installed:
* **build-essential** (hopefully you took care of this in ntr0)
* **wiringpi** (hopefully you took care of this in led0)
=====Compiling=====
Since the grabit brought in a Makefile, you can compile your code simply by typing: **make**
Any compiler errors will go into a text file called **errors**
To do a full cleaning, run: **make clean** then **make** (or **make debug**)
If you'd like to see compiler messages as you compile, run: **make debug**
When done and ready to submit, on lab46: **make submit**
=====Submission=====
To successfully complete this project, the following criteria must be met:
* Code must compile cleanly (no notes, warnings, nor errors)
* Output must be correct, and match the form given in the sample output above.
* Code must be nicely and consistently indented
* Code must be well commented
* Do NOT double space your code. Group like statements together.
* Output Formatting (including spacing) of program must conform to the provided output (see above).
* Track/version the source code in a repository
* Submit a copy of your source code to me using the **submit** tool.
* Post required images and obtain needed confirmation to proceed from me on class channel on discord.
To submit this program to me using the **submit** tool, run the following command at your lab46 prompt:
lab46:~/src/SEMESTER/DESIG/iwb1$ make submit
You should get some sort of confirmation indicating successful submission if all went according to plan. If not, check for typos and or locational mismatches.
What I'll be looking for:
65:iwb1:final tally of results (65/65)
*:iwb1:post picture of unpowered layout to #desig and get approval [8/8]
*:iwb1:post picture to #desig by Sunday before deadline [4/4]
*:iwb1:post picture of button-enabled LED count in layout to #desig [8/8]
*:iwb1:grabit on the code on lab46 by Sunday before deadline [4/4]
*:iwb1:iwb1.c code adequately modified per project requirements [20/20]
*:iwb1:iwb1.c comments describing what is happening [12/12]
*:iwb1:updated code is pushed to lab46 repository [9/9]
Additionally:
* Solutions not abiding by spirit of project will be subject to a 25% overall deduction
* Solutions not utilizing descriptive why and how comments will be subject to a 25% overall deduction
* Solutions not utilizing indentation to promote scope and clarity will be subject to a 25% overall deduction
* Solutions not organized and easy to read are subject to a 25% overall deduction