GPIO reading for external value
rrsuj
New Member Posts: 2 ✭
Hi,
The GPIO blink program using write operation works for me, which is described here - https://up-community.org/forum/public-ubilinux/2141-tutorial-gpio-i2c-spi-access-without-root-permissions#5724
But now I want to read signal using pin 16 (UP GPIO 18, linux GPIO 23), so I change the above mentioned program like this -
When I execute the program the value is always 1. I think after boot the gpio becomes high, so it reads value 1 always.
So I change the active_low to 1 to make the reading value to zero (I did: echo 1 > /sys/class/gpio/gpio23/active_low)
After that when I execute the program the value is always 0.
Now I connect pin1 to pin16, so that pin16 gets 3.3v, but there is no change in the readings of the program.
It still reads 0.
How can I read external signal using the GPIO in the correct way?
Please help me in this issue.
The GPIO blink program using write operation works for me, which is described here - https://up-community.org/forum/public-ubilinux/2141-tutorial-gpio-i2c-spi-access-without-root-permissions#5724
But now I want to read signal using pin 16 (UP GPIO 18, linux GPIO 23), so I change the above mentioned program like this -
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <fcntl.h>
#include <getopt.h>
#include <sys/ioctl.h>
#include <linux/gpio.h>
#include <time.h>
#include <mraa.h>
#define HEADERPIN 16
void sleepMillis(uint32_t millis) {
struct timespec sleep;
sleep.tv_sec = millis / 1000;
sleep.tv_nsec = (millis % 1000) * 1000000L;
while(clock_nanosleep(CLOCK_MONOTONIC, 0, &sleep, &sleep) && errno == EINTR);
}
int main(int argc, char **argv)
{
mraa_init();
mraa_gpio_context gpio;
if (!(gpio = mraa_gpio_init(HEADERPIN))) {
fprintf(stderr, "Error exporting pin %d!\n", HEADERPIN);
mraa_deinit();
exit(1);
}
/* Check if the binary has root-permissions: if not,
sleep for 100ms to give udev time to set the GPIO-permissions
correctly for us to use the pin we just initialized above.
!IMPORTANT! */
/* Try uncommenting this or changing the amount of time
we sleep and see what happens. */
if(geteuid()) sleepMillis(100);
if(mraa_gpio_dir(gpio, MRAA_GPIO_IN) != MRAA_SUCCESS){
fprintf(stderr, "Error setting pin-direction!\n");
mraa_gpio_close(gpio);
mraa_deinit();
exit(1);
}
int test;
while(1){
test = mraa_gpio_read(gpio);
printf("value: %d\n", test);
sleepMillis(1000); //Sleep one second
}
mraa_gpio_close(gpio);
mraa_deinit();
exit(0);
}
When I execute the program the value is always 1. I think after boot the gpio becomes high, so it reads value 1 always.
So I change the active_low to 1 to make the reading value to zero (I did: echo 1 > /sys/class/gpio/gpio23/active_low)
After that when I execute the program the value is always 0.
Now I connect pin1 to pin16, so that pin16 gets 3.3v, but there is no change in the readings of the program.
It still reads 0.
How can I read external signal using the GPIO in the correct way?
Please help me in this issue.
Comments
-
Hi rrsuj
The active low property doesn't change the external behaviour it only change the reported value.
So To read a 1 you have to put the pin at 0 (GND, pin 6 of the hat https://up-community.org/wiki/Pinout)
Regards
Nicola Lunghi -
Hi Nicola,
Sorry I am not getting it, I have connected pin16 to pin1 just for test.
In real environment, I have the plan to connect this input gpio to an external circuit, and the external circuit sends 0v or 1v. I need to read the 0/1 volt of the external circuit correctly through this gpio using the program running inside UP board.
So I am confused how connecting to ground can help me in real environment where the gpio will be connected to another circuit (no ground line).
How can I work in the real environment then?