Written by coh at home

[Maixbot]Analog IO 본문

Advanced/Maixbot Project

[Maixbot]Analog IO

och 2023. 7. 10. 13:20

digital과 analog의 차이는 continuous한 신호의 차이라고 말할 수 있다.

예컨데 LED를 끄고 키는 것은 digital. LED의 밝기는 analog로 표현할 수 있을 것이다.

 

Maixduino는 6channel의 12bit resolution의 ADC가 포함되어있다.

6channel은 A0~A5의  6개pin으로 센서 입력값을 받을 수 있다는 뜻이고

12bit 해상도는 이떤 입력의 크기를 0 ~ 2^12 - 1 value로 표현 가능하다는 뜻이다. 

3.3V / 4096 = 0.8mV 의 전압값을 인식 가능하고

2^12 -1 은 3.3v로 mapping된다. 

음.. 근데 maixduino의 ADC는 K210 칩에 있는 게 아니라 ESP32 칩에 있기 때문에 이걸 통신으로 전달해줘야한다.

속도 이슈가 있을 수 있음. 

 

다음은  ADC를 연결한 코드이다.

wifi클래스에서는 통신을 위한 setup과정이 들어있다.

이후 while 문에서는 adc 에 adc로 읽어들인 tuple자료를 반납하면서 출력하게 하였다.

 

다음은 초음파 센서에 대한 코드이다. 동작 원리는 따로 다루지 않겠다. 

주목해야할 것은 Timer함수이다. 해석은 Timer는 0, Channel은 0을 사용하고 20ms를 주기적으로 on_timer함수를 불러오겠다는 뜻이다.

 

while문은 device가 여유가 될 때마다 실행되므로 정확한 시간을 측정할 수 없다.

c언어와 연계해서 생각해보면 

#include <stdio.h>
#include <sys/time.h>
#include <unistd.h>

int main()
{
	struct timeval t;
	gettimeofday(&t, 0);

	printf("%lu\n", t.tv_sec * 1000 + t.tv_usec / 1000);
	usleep(1000 * 100);
	gettimeofday(&t, 0);
	printf("%lu\n", t.tv_sec * 1000 + t.tv_usec / 1000);
	
}

의 실행결과는 100ms의 정확한 오차만 났으면 좋겠는데 실제로는 

./a.out   
1679403920233
1679403920339

 

다음과 같이 6ms의 오차가 존재한다. 이는 thread의 동작원리와 연관이 있는데

thread는 ready, running, block의 사이클을 가지며 usleep이 끝난다고 바로 running이 되는 것이 아니기 때문.

그래서 나는 다음과 같이 문제를 해결했었다. 시간을 100ms지났을 때 체크하는 것이 아니라

while loop을 통해 100ms가 지났는지 usleep을 쪼개서 체크를 했었다.

#include <unistd.h>
#include <stdio.h>
#include <sys/time.h>

size_t	get_time(void)
{
	struct timeval time;
	if (-1 == gettimeofday(&time, 0))
		return (0);
	return (time.tv_sec * 1000 + time.tv_usec / 1000);
}

size_t	checkTime(size_t t)
{
	struct timeval time;
	gettimeofday(&time, 0);
	return (time.tv_sec * 1000 + time.tv_usec / 1000 - t);
}

void	waitingTime(size_t time)
{
	size_t	start;

	start = get_time();
	while (1)
	{
		if (checkTime(start) >= time)
			break ;
		usleep(10);
	}
}

int main()
{
	struct timeval t;
	gettimeofday(&t, 0);

	printf("%lu\n", t.tv_sec * 1000 + t.tv_usec / 1000);
	waitingTime(100);
	gettimeofday(&t, 0);
	printf("%lu\n", t.tv_sec * 1000 + t.tv_usec / 1000);
}

 

파이썬 코드도 마찬가지일 것이다. 이러한 정밀한 시간 시스템이 필요하게 된다면 저런 식으로 오차를 잡아주는 함수가 필요할 것이고 그것이 Timer함수일 것이다. 

 

라즈베리파이로도 timer를 측정했었는데 필요하다면 확인하는 것도 괜찮겠다. 

echo.irq함수는 인터럽트함수로서 echo핀의 값이 Falling edge일 때 해당 함수를 불러오는 함수이다.

echo핀은 이제 반사된 음파가 들어오면 falling edge로 변하기 때문이다.

 

근데 굳이 필요는 없을 것 같은데..  

'Advanced > Maixbot Project' 카테고리의 다른 글

[Maixbot] camera & LCD  (0) 2023.07.10
[Maixbot]Analog output  (0) 2023.07.10
[Maixbot]AI concept review with CNN  (0) 2023.07.07
[Maixbot]Digital Input  (0) 2023.06.28
[Maixbot]Simple Example, Output  (0) 2023.06.28