My, bad, I read the question wrong… I thought he was asking how he can program the arduino with labview… Disregard my post
There is also a CAN bus shield available, although I know little about it. It has a DB9 connector, which I guess means it’s really intended to interface with automotive diagnostics stuff (complete with a sd card slot for data logging!). Still, I’m sure a clever team could handle the wiring and code required to interface it on a FIRST bot.
There are, of course, legal issues regarding custom circuits being in the CAN bus loop. Without carefully looking I think using the bus just to pass data is ok, as long as it doesn’t try to control motors. I’m not sure exactly what practical advantage it would give you over SPI or I2C, but it would be pretty neat.
CAN bus shield on Sparkfun. It might be avalible elsewhere.
Custom Circuits are explicatively allowed to be on the CAN bus. They are also explicatively illegal to control any non-decorations (and I’m not sure about the rules on decorations). Unless, of course, you email FIRST and get something as an approved motor controller.
I’d most likely try to communicate using I2C, but if you can get the C-RIO to send out serial commands, that’s the arduino’s native protocall.
Well, we might be
but not all that clever, especially when we’re short on time. I’ll have to check those possibilities, Eric. Where does the data wire(s) get connected? Right now I’m in the “one step back” mode (computer doesn’t want to download to the Arduino), so it’ll be a bit.
All I need is to send a single number to the Arduino, and it’ll turn on some LEDs. Can I do it through a Digital IO (which sounds the simpliest method)? WPI_PWMSetValue.vi?
Just saw Adam’s post: Yeah, it’s not quite decorative LEDs, so thats out. Any of the LabVIEW I2C examples are good to look at? Or the serial?
How big a number?
You can simply use the digital outputs on a sidecar to digital inputs on the Arduino to send a binary number.
You don’t need a communications protocol to do that.
Maybe use one DIO to signal when the number has changed and should be read by the Arduino.
Do you mean (for example) 4 DIOs sending a binary signal for 16 numbers? (And no, I don’t have many numbers, but I can think of ways to expand that.) Just using the signal portion of the PWM wire, right? (The Keeper of the Numbers says we have 5 DIOs free for use.) Heh – I had thought of that too, when we originally thought of using DIOs. It seemed too obvious to be true. Could it really be that simple? Thanks, Mark!
Of course, I spent the day trying to make connections on an older robot to test all this, and now discovered (after connecting all the dots, so to speak) that LabVIEW and the Arduino programming port don’t play nice together. I am making a nice collection of laptops around me just to test this.
Yes, if you’re not doing a high volume of data, this is an easy and viable method.
Well we are talking about an Arduino.
But no, just a signal to change lights.
Howsoever, I did see at FLR a team using an Arduino for sonar processing, but I don’t know what kind of data they were sending back to the cRIO – much more than I’m asking for, I’m sure. These little boards are fun to work with.
An update – I have some LabVIEW code that sends a DIO true/false value depending on a button press, recieved by the Arduino on a digital pin, and blinks the light on the Arduino and also prints out the high/low value (simple test), slowed down to 1/2 second cycle. Currently I’m getting a semi-random highs/lows, even without pressing the button, which I’m guessing is LV’s issue, not continually sending the true/false signal? Unfortunately, I lost my LV computer so I can’t check it – maybe I can schedule for a 3 am session? :ahh:
If you haven’t opened the IO port in your code, I think it may leave the signal pin floating. Does it work when you press the button, or does it ignore the button as well?
I think it’s opened once in the Begin.vi (the computer got grabbed so I can’t look at the code at the moment), and just referenced during the button pressing, and not open/send/closed each time.
There was no discernable difference when the button got pressed.
Consider the fact that a boolean on the PPC is 4 bytes. Also consider the fact that the Arduino uses little endianness. I am not sure about the PPC on the cRio, it might be a big endian, that might bring up some troubles.
But aren’t they both using an on/off electical signal to talk between them? Not code.
(Pay Per Click?)
Well, Boolean only takes up 1 byte (8 bits) in Arduino, the PPC uses 4 Bytes instead (the PPC registers are 32bits). Sending over a boolean from the PPC sends 32 bits of data. Now, considering that you can’t fit 32 bits in a 8 bit register, you have to cut the extra data off using some bit manipulation. And the other problem I was pointing to was that the PPC usually are Big endian, but they can be bi (so it can be both, just not at the same time) that means the bits read from left to right, but the little endian reads right to left. So you need to do some switcharoos there.
So on the cRio a “true” would be represented as:
0000_0000_0000_0001B (if big endian)
0001_0000_0000_0000B (If little endian)
Note: I might be wrong about the above regarding the binary
on the Arduino, you need to just take the last 4 bits so it becomes:
0001B
Every microprocessors have millions and billions of transistors, they all use electrical signals.
Now, if there are any veterans here, feel free to rebuke me. I am a student, I make mistakes and then learn from them.
Setting a TRUE output on a DIO slot sends 5V of power down the wire. That’s one bit, not 32. He’s planning on using four DIO slots to send 4 bits of data to the arduino.
Just a note, you can put the PWM cable in sideways on the signal so you use two cables instead of four.
Can you put a multimeter on the slots? Can you post the arduino sketch?
Oh, then NVM me, I thought he was sending data through ethernet
This sounds VERY much like your pin is floating. This is not really a programming issue, but a wiring/electrical issue.
Watch this video, note why he uses the resistor. If you get it, good, otherwise, I’ll explain:
Originally Posted by Roger
But aren’t they both using an on/off electical signal to talk between them? Not code.
Yes and no. The cRIO will send out an on/off electrical signal, but the Arduino DIO pin does not “sense” “on or off.” It senses 5v or Ground. If you hook it up to nothing (what you may call “off”), it will basically sense the voltage of the wire/air that it is connected to. Ever looked at a volt meter when you haven’t yet hooked it up to a power source? It wanders all over the place. This is what your Arduino DIO pin is doing. It could be anything, high or low. You need to use a resistor to specifically connect the DIO pin to Ground when it isn’t sensing a 5v from the cRIO DIO pin. This is called using a pull-down resistor (not to be confused with a pull-up resistor, but similar idea).
Do you have a mentor who is an electrical engineer or knows electronics? You should have him help you out. This concept is a little tricky, it took me a while to figure out. Before that I was thinking the same as you.
I’m pretty sure the DIO ports on the C RIO are never left floating (at the very least not after they’re initialized), so that doesn’t make much sense. There’s nothing in the datasheet about it, strangely enough, except that there’s a 10K pullup already on it. Maybe that’s not disconnected when it switches to output? That wouldn’t make much sense though.
I’d say test continuity, and then go to voltage mode on your multimeter, and do one lead on ground and the other on the signal. If you get zero, put the first on 5V. If they’re both zero, the pin in floating for whatever reason, if one is zero and the other is 5V, then it’s something in the wiring/arduino.
(Sorry, I went home and slept a bit.) Here’s the Arduino sketch:
int ledPin = 13; // LED connected to digital pin 13
int inPin = 7; // pwm white wire connected to digital pin 7
int val = 0; // variable to store the read value
void setup()
{
pinMode(ledPin, OUTPUT); // sets the digital pin 13 as output
pinMode(inPin, INPUT); // sets the digital pin 7 as input
Serial.begin(9600); //Added this, seems to allow the prints to print
}
void loop()
{
val = digitalRead(inPin); // read the input pin
digitalWrite(ledPin, val); // sets the LED to the button's value
Serial.println(val); // print out the 1 or 0
delay(500); // Added 1/2 second delay just to slow down the prints
}
I took it from Arduino’s DigitalRead() page. I wasn’t going to get fancy until I got something that made sense.
On the LabVIEW side there is code that if (one of 4) buttons are pressed, send a True/False to DIO Out Set (WPI_DigitalOutputSetValue.vi). I hold the button down to test, not momentarily. Currently (with the delay) the print sends “1100000111000011000001100” with or without the button presses, and there is no pattern to the length of the 1 or 0 groups. Without the delay it was all 1s. I also used the built-in LED on 13 to see if it’s on or off.
RoboMaster: I have the book version of that video (that’s how I got my first Arduino). I’m not ashamed to say I’m not electrical-minded, but I know enough to keep me out of too much trouble. For this project originally I used the button setup to control the Arduino switching the LEDs. I’ve wondered about that resistor. This would be a simple test: Put the wire on a breadboard, split it with a resistor to ground, and a wire to Arduino’s pin 7.
I did understand David’s answer (I think I did; hanging around teens I get that a lot), and I was answering more of a programming mode than electrically.
WizenedEE: Maybe in the “robot world” the DIO ports aren’t left floating, but when the wire is jumping into “Arduino world”, would it need it’s own de-floater resistor? I’m guessing at this.
I do have a sensors/electrical mentor; he probably knows every wire on the robot on a first-name basis. He can test the wires to make sure they are what they ought to be.
Sigh. Electricity was so much simpler when I grew up, when power went from + to - and not both ways. 
Okay, back at the ranch… I tried with and without a resistor (10K and 1K – that’s okay? It’s all I had). Signal from DIO connected to the Arduino 7 pin and also to a resistor to Arduino ground. I hope I got that right? I also took the delay out. With a resistor, it’s always zero. Without, the Low/High is
11111100000000
11111100000000
11111100000000
11111100000000
11111111000000
11111111000000
11111111000000
11111111000000
1111111100000000
11111100000000
11111100000000
11111100000000
11111100000000
11111111000000
11111111000000
11111111000000
11111111000000
1111111100000000
11111100000000
11111100000000
11111100000000
11111100000000
11111111000000
11111111000000
11111111000000
11111111000000
1111111100000000
(I manually formatted it – it’s a 128 bit cycle, not that I checked it all.) Pressing the joystick button gets a true/false to the DIO out set vi, but no changes to the pattern.