Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed
Fork of Official by
main.cpp
- Committer:
- joankangro
- Date:
- 2016-03-21
- Revision:
- 1:7cdb9114f511
- Parent:
- 0:60a314903fb0
File content as of revision 1:7cdb9114f511:
#include "mbed.h"
//Pull everything up
DigitalOut pull1(PTE2);
DigitalOut pull2(PTA2);
//DigitalOut pull4(PTA12);
//DigitalOut pull5(PTA4);
DigitalOut pull6(PTA5);
//DigitalOut pull7(PTC8);
DigitalOut pull9(PTA13);
DigitalOut pull10(PTD5);
DigitalOut pull11(PTD0);
DigitalOut pull12(PTD2);
DigitalOut pull13(PTD3);
DigitalOut pull14(PTD1);
DigitalOut pull15(PTE0);
DigitalOut pull16(PTE1);
//DigitalOut pull17(PTC7);
//DigitalOut pull18(PTC0);
//DigitalOut pull19(PTC3);
DigitalOut pull20(PTC4);
DigitalOut pull27(PTE31);
DigitalOut pull28(PTD6);
DigitalOut pull29(PTD7);
//DigitalOut pull30(PTE30);
//DigitalOut pull38(PTE3);
//DigitalOut pull39(PTE2);
//DigitalOut pull50(PTB11);
//DigitalOut pull51(PTB10);
//DigitalOut pull52(PTB9);
//DigitalOut pull53(PTB8);
//DigitalOut pull34(PTE21);
//DigitalOut pull35(PTE20);
//DigitalOut pull47(PTB1);
//DigitalOut pull48(PTB0);
DigitalOut pull100(PTA20);
//motor driver outputs
DigitalOut IN4(PTC5);
DigitalOut IN3(PTC6);
DigitalOut IN2(PTC10);
DigitalOut IN1(PTC11);
PwmOut ENA(PTC9);
PwmOut ENB(PTD4);
DigitalOut indicator(LED_BLUE);
//constant 3.3 volts for sensors
DigitalOut constant1(PTE5);
DigitalOut constant2(PTE4);
DigitalOut constant3(PTE3);
DigitalOut constant4(PTC0);
DigitalOut constant5(PTC7);
DigitalOut constant6 (PTC3);
//line following inputs
AnalogIn leftmost(PTB0);
AnalogIn left(PTC2);
AnalogIn middle(PTB3);
AnalogIn right(PTB2);
AnalogIn rightmost(PTB1);
DigitalIn back(PTB10);
DigitalIn midbar(PTB11);
DigitalIn front(PTE2);
//debugging led outputs
DigitalOut ledleftmost(PTE20);
DigitalOut ledright(PTE23);
DigitalOut ledmiddle(PTE22);
DigitalOut ledleft(PTE29);
DigitalOut ledrightmost(PTE21);
DigitalOut ledback(PTC4);
DigitalOut ledmidbar(PTB8);
DigitalOut ledfront(PTB9);
//ball firing
PwmOut motors(PTA12);
DigitalOut solenoid(PTA2);
//Ball dispensing
DigitalOut dispenser(PTA4);
//Ball Counter
DigitalOut constant7(PTC16);
DigitalOut bcd1(PTC17);
DigitalOut bcd0(PTE31);
DigitalOut bcd3(PTA17);
DigitalOut bcd2(PTA16);
InterruptIn ball_trigger(PTD7);
DigitalOut constant8(PTD6);
//Serial bluetooth(PTD3, PTD2); //tx,rx
PwmOut speaker(PTA5);
//Old
/*Ticker sine_interrupt;
AnalogOut Aout(PTE30);
double interrupt_f = .00001525878; // (1/2048*32)
static int sine_wave_steps = 32; // number of steps in sine wave
int sine_counter = 0;
static float sine_val[] = {.5,.5976,.6914,.7773,.8535,.9160,.9619,.9902,1,.9902,.9619,.9160,.8535,.7773,.6914,.5976,.5,.4023,.3085,.2226,.1464,.0839,.0380,.0097,0,.0097,.0380,.0839,.1464,.2226,.3085,.4023};
void create_sine() { //subroutine for interrupt, creates sine wave
sine_counter = sine_counter + 1; //run through sine array
if (sine_counter >= sine_wave_steps){
sine_counter = 0; //repeat sine wave
}
Aout = sine_val[sine_counter]; //output decimal 0-1 on DAC
}*/
int counter = 0;
int bar=0;
int i=0;
static int ballcount=0;
float k = 0;
bool go_slower=true;
bool stop=false;
void sound()
{
//speaker.period(1.0/500.0); // 500hz period
//speaker =0.5; //50% duty cycle - max volume
for (k=400; k<470; k=k+8) {
speaker.period(1.0/float(k));
speaker=0.5;
wait(.1);
}
speaker=0;
}
void debugger()
{
//speaker.period(1.0/500.0); // 500hz period
//speaker =0.5; //50% duty cycle - max volume
for (k=400; k<435; k=k+7) {
speaker.period(1.0/float(k));
speaker=0.5;
wait(.1);
}
speaker=0;
}
void display()
{
if (ballcount == 0) {
bcd0 = 0;
bcd1 = 0;
bcd2 = 0;
bcd3 = 0;
}
if (ballcount == 1) {
bcd0 = 1;
bcd1 = 0;
bcd2 = 0;
bcd3 = 0;
}
if (ballcount == 2) {
bcd0 = 0;
bcd1 = 1;
bcd2 = 0;
bcd3 = 0;
}
if (ballcount == 3) {
bcd0 = 1;
bcd1 = 1;
bcd2 = 0;
bcd3 = 0;
}
if (ballcount == 4) {
bcd0 = 0;
bcd1 = 0;
bcd2 = 1;
bcd3 = 0;
}
if (ballcount == 5) {
bcd0 = 1;
bcd1 = 0;
bcd2 = 1;
bcd3 = 0;
}
if (ballcount > 5) {
ballcount = 0;
}
}
int loops=0;
void generatepwm(){
loops=0;
while(loops<2000){
dispenser=1;
wait_us(244);
dispenser=0;
wait_us(244);
loops++;
}
}
bool balldrop=false;
void count()
{
if(balldrop==true){
wait_ms(0.55); //this time has to be optimised to stop false positives
if(ball_trigger==0) {
ballcount++;
indicator = 0;
wait (0.25);
indicator = 1;
display();
}
}
}
int balls=0;
int barcode()
{
/*if(front==1 or midbar==1 or back==1){
//ENA=0.29;
//ENB=0.29;
}
*/
if(front==1) {
ledfront=1;
//ENA=0.25;
//ENB=0.25;
} else {
ledfront=0;
}
if(midbar==1) {
ledmidbar=1;
//ENA=0.25;
//ENB=0.25;
} else {
ledmidbar=0;
}
if(back==1) {
ledback=1;
//ENA=0.25;
//ENB=0.25;
} else {
ledback=0;
}
if(midbar==1 and back==1 and front==0){ //or (midbar==1 and front==1)) {
//shoot balls
ballcount=5;
display();
ENA=0;
ENB=0;
motors=0.09;
stop=false;
if (ballcount>0){
while(ballcount>0){
ballcount--;
sound();
wait_ms(550);
solenoid=1;
display();
wait_ms(45);
solenoid=0;
wait(1);
stop=true;
}
}
go_slower=false;
motors=0;
ENA=0.35;
ENB=0.35;
if(stop==true){
wait(2);
}
return bar==1;
} else if(front==1 and midbar==0 and back==1) { //test barcode
balldrop=true;
ballcount=0;
display();
ENA=0;
ENB=0;
while(ballcount<5){
generatepwm();
dispenser=0;
wait(1);
}
ENA=0.35;
ENB=0.35;
wait(2);
go_slower=true;
return bar==1;
}
//sine_interrupt.detach();
wait(0.1);
return bar ==0;
}
int main()
{
pull100=0;
pull1=0;
pull2=0;
//pull3.mode(PullUp);
//pull4=0;
//pull5=0;
pull6=0;
//pull7=0;
//pull8.mode(PullUp);
pull9=0;
pull10=0;
pull11=0;
pull12=0;
pull13=0;
pull14=0;
pull15=0;
pull16=0;
//pull17=0;
//pull18=0;
//pull19=0;
pull20=0;
//pull21=0;
//pull22=0;
//pull23=0;
//pull24=0;
//pull25=0;
//pull26=0;
pull27=0;
pull28=0;
pull29=0;
//pull30=0;
//pull34=0;
//pull35=0;
//pull38=0;
//pull39=0;
//pull47=0;
//pull48=0;
//pull49=0;
//pull50=0;
//pull51=0;
//pull52=0;
//pull53=0;
motors.period(3.0);
motors.write(0);
solenoid=0;
constant1=1;
constant2=1;
constant3=1;
constant4=1;
constant5=1;
constant6=1;
indicator=1;
wait(0.3);
indicator=0;
wait(0.3);
indicator=1;
wait(0.3);
indicator=0;// because its a pile of shite
dispenser=0;
ENA.period(0.001);
ENB.period(0.001);
IN1=0;
IN2=1;
IN3=0;
IN4=1;
//set inital pwm values for motor driver outputs
ENA=0;
ENB=0;
//You´ll never be the real slim shady
//int counter=0;
bcd0 = 0;
bcd1 = 0;
bcd2 = 0;
bcd3 = 0;
constant7 = 1;
constant8=1;
ballcount=0;
ball_trigger.fall(&count);
//sine_interrupt.attach(&create_sine , interrupt_f);
while(1) {
//sine_interrupt.attach(&create_sine , interrupt_f);
//sine_interrupt.detach();
bar = 0;
balldrop=false;
//counter=counter+1;
//zonecounter=zonecounter+1;
if(middle<0.4 & left<0.4 & right<0.4 & leftmost<0.4 & rightmost<0.4) {
//skip the loop
ledmiddle=0;
ledleft=0;
ledright=0;
ledleftmost=0;
ledrightmost=0;
} else {
if(middle>0.4) {
ledmiddle=1;
ENA=0.46;
ENB=0.45;
} else {
ledmiddle=0;
ENA=0.41;
ENB=0.4;
}
if(go_slower==true){
ENA=0.39;
ENB=0.38;
}
if(left>0.4) {
ledleft=1;
ENA=0.3;
} else {
ledleft=0;
}
if(right>0.4) {
ledright=1;
ENB=0.28;
} else {
ledright=0;
}
if(leftmost>0.4) {
ledleftmost=1;
ENA=0;
} else {
ledleftmost=0;
}
if(rightmost>0.4) {
ledrightmost=1;
ENB=0;
} else {
ledrightmost=0;
}
if((left>0.4 or leftmost>0.4)and(right>0.4 or rightmost>0.4)) {
ENB=0.38;
ENA=0;
wait(2);
}
if(bar == 0) {
barcode();
}
wait(0.01);
}
}
}
