So my team wants me to program a photosensor in Java for our Autonomous code, but no matter where I look I can not find anything on any sample code that can help me. Is there anybody out there who can help me in the slightest? You help would be much appreciated :yikes:
In NetBeans, if you create a new FRC Project, and choose from the FRC Sample Projects, you can see one that is a line following project. If you create that project, you can see the example code. It’s a bit hard to follow, but it works on the a few basic premises:
- Using the driver station’s digital inputs to choose whether to follow the straight or narrow, and whether to go left or right at the fork
- Changing the motor’s speed based on the time that has elapsed
- Getting the values from the light sensors and storing it in an integer as a single binary string, i.e. 111 (7) is all sensors on, 000 (0) is all sensors off, 010 (2) is the middle sensor on, etc.
- Running a switch statement based on the binary string to determine how much to turn.
Take a look through it, and if you have any questions, feel free to come back and ask.
Let me begin by saying the provided sensor code is garbage! I basically ended up ripping it apart and pretty much coding my own.
The sensors are DigitalInputs, and they have a get() function that returns true if the tape is sensed, false if not. See the example below.
DigitalInput middle, right, left;
public Robot() {
middle = new DigitalInput(1);
right = new DigitalInput(2);
left = new DigitalInput(3);
}
public void autonomous() {
if(middle.get()) {
// drive straight
} else if(right.get()) {
// drive left
} else if(left.get()) {
// drive right
}
}
In the best of worlds (you starting off right on the line) that will probably keep you on the line, though in any case you’ll be wobbling back and forth (and if you can’t count on your orientation, good luck hanging a tube!), and if you happen to pass the line by a bit (as will likely happen) you’ll just stop.
That’s a really good concept to start with, but it needs more fleshing out.
This is all helpful, I only wish I had more expertise in Java. This is still kind of a new thing for me to learn so I am completely out of my league. Thank you for your help! If you are able to help a little more on the
if(middle.get())
concept that would help. I can’t help but feel I am missing something here.
The line sensors send true if a line is underneath and false if there is not a line underneath. The get method return that value. Basically, middle is the digital input plugged in to slot 1. if(middle.get()) checks to see if there is a line underneath that sensor. That’s my impression of it, anyway. We only used line sensors temporarily, since we aren’t sure if we’ll even have a functioning arm to use with them.
Well heres a new development, we only own one photosensor, so should I only have the middle part of the code? Or should I use a whole new code?
You should have gotten three of the photoelectic sensors in the Kit of Parts.
As others have said, you want to put the three line sensors in a row, spaced apart a little. Then you have to adjust them such that the LED’s on the sensors change colors as you move the robot past the tape.
Then, depending on how you wired them, you will get a value from the sensor with a digitalinput. The Get method returns a value, 1 or 0 when the sensor sees the line, or doesn’t, depending on how you wired them.
From there, you basically go forward while the center one is on the line, then if either side sees the tape, turn a bit until only the center sees the line.
Here’s my teams code that I wrote for this. We can do the Y + the straight profiles of the line. Since this is fairly outdated I am not to worried about leeching.
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package org.freelance.logic;
import edu.wpi.first.wpilibj.Timer;
import org.freelance.sensors.Photoswitch;
import org.freelance.sys.MecanumDrive;
import org.freelance.util.Constants;
/**
*
* @author Freelance Robotics (Hadyn Fitzgerald)
*/
public class Linetracking {
private boolean done = false;
private boolean left = false;
private int profile = 1; //1 == Y, 0 == Straight
private Photoswitch leftSwitch;
private Photoswitch centerSwitch;
private Photoswitch rightSwitch;
private final byte NONE_OPCODE = 0, LEFT_OPCODE = 1, CENTER_OPCODE = 2,
RIGHT_OPCODE = 4, ALL_OPCODE = 7;
private double FORWARD = -.5, BACKWARD = .5, LEFT = -.425, RIGHT = .425;
private int stage = 0;
public Linetracking() {
initLineTracking();
}
private void initLineTracking() {
/**
* Construct Photoswitches
*/
leftSwitch = new Photoswitch(Constants.LEFT_SLOT);
centerSwitch = new Photoswitch(Constants.CENTER_SLOT);
rightSwitch = new Photoswitch(Constants.RIGHT_SLOT);
}
public byte getType() {
byte type = 0;
if(leftSwitch.get())
type += 1;
if(centerSwitch.get())
type += 2;
if(rightSwitch.get())
type += 4;
System.out.println(type);
return type;
}
public boolean process(MecanumDrive drive) {
byte type = getType();
switch(type) {
case NONE_OPCODE:
if(profile == 0) {
drive.controllerDrive(0, 0, 0);
} else
if(stage == 0) {
for(int a = 0; a < 50; a++) {
if(left)
drive.controllerDrive(0, 0, -.3);
else
drive.controllerDrive(0, 0, .3);
}
while(getType() != CENTER_OPCODE) {
if(getType() == ALL_OPCODE)
break;
if(left)
drive.controllerDrive(0, LEFT, 0);
else
drive.controllerDrive(0, LEFT, 0);
}
stage++;
} else if(stage == 1) {
for(int a = 0; a < 35; a++) {
if(left)
drive.controllerDrive(0, 0, .3);
else
drive.controllerDrive(0, 0, -.3);
}
done = true;
} else {
drive.controllerDrive(0, 0, 0);
}
break;
case LEFT_OPCODE:
while(getType() != CENTER_OPCODE) {
if(getType() == NONE_OPCODE || getType() == ALL_OPCODE)
break;
drive.controllerDrive(0, RIGHT, 0);
}
break;
case CENTER_OPCODE:
drive.controllerDrive(FORWARD, 0, 0);
break;
case RIGHT_OPCODE:
while(getType() != CENTER_OPCODE) {
if(getType() == NONE_OPCODE || getType() == ALL_OPCODE)
break;
drive.controllerDrive(0, LEFT, 0);
}
break;
case ALL_OPCODE:
drive.controllerDrive(0, 0, 0);
if(profile == 0) {
done = true;
}
break;
}
return done;
}
public void reset() {
stage = 0;
}
}
How are you guys programming your Y’s? I’m having some trouble with mine. Any tips would be really appreciated.
Our robot drives straight on the line, so it notices when the middle sensor is no longer over the tape, but the left and right both are. At that point, we begin turning in the direction we want to go. Using the code you’ve already posted as a template:
if(left.get() && !middle.get() && right.get()) {
// turn left or right, depending on what you want
}
It wouldn’t go on as another else, it would be a separate if, or it would never be triggered.