Why do you mix two examples ? They are slightly different.
And may I say, they both look more complicated than they should be. Reading a simple button can be done by just a digitalRead().
Why do you use the ROS echo chatter ? That makes it even more complicated.
Did you use the build-in examples of the Arduino ? They are not complicated and they invite you to alter them to understand it.
How do you want to wire your button ?
A button is mostly connected to ground with a pull-up resistor to 5V. If that is used, a digitalRead() will read a LOW if the button is pressed and HIGH if the button is not pressed.
You also have to use a multimeter to see which pins of the button connect. If you rotate it 90 degrees it is not working.
* Button Example for Rosserial
*/
#include <ros.h>
#include <std_msgs/Bool.h>
ros::NodeHandle nh;
std_msgs::Bool pushed_msg;
ros::Publisher pub_button("pushed", &pushed_msg);
const int button_pin = 7;
const int led_pin = 13;
bool last_reading;
long last_debounce_time=0;
long debounce_delay=50;
bool published = true;
void setup()
{
nh.initNode();
nh.advertise(pub_button);
//initialize an LED output pin
//and a input pin for our push button
pinMode(led_pin, OUTPUT);
pinMode(button_pin, INPUT);
//Enable the pullup resistor on the button
PORTD |= (1<<PD7);
//The button is a normally button
last_reading = ! digitalRead(button_pin);
}
void loop()
{
bool reading = ! digitalRead(button_pin);
if (last_reading!= reading){
last_debounce_time = millis();
published = false;
}
//if the button value has not changed for the debounce delay, we know its stable
if ( !published && (millis() - last_debounce_time) > debounce_delay) {
digitalWrite(led_pin, reading);
pushed_msg.data = reading;
pub_button.publish(&pushed_msg);
published = true;
}
last_reading = reading;
nh.spinOnce();
}