Skocz do zawartości
Zaloguj się, aby obserwować  
Marcinas

Algorytm , kod do LF Język C

Pomocna odpowiedź

Witam

Mam pytanie prośbę czy był by ktoś w stanie pomóc stworzyć napisać program do LF.

Otóż mam taki problem jak napisać kod do czujników np.cny 70 ,kitry jak się pisze taki kod zaczynam dopiero naukę i nie ogarniam jeszcze czy był by ktoś na tyle miły aby napisać mi taki kod ze szczegółowym wyjaśnieniem ?

Jak utworzyć taki algorytm aby dobrze działa na jakiej zasadzie to się tworzy czy był by jakiś chętny może ktoś ma nawet jakieś propozycje co przeczytać co zrobić jak już wspomniałem dopiero zaczynam a jak by ktoś mi objaśnił to jak najdokładniej to już bym wiedział jak co 😃

Fajnie i miło by było gdyby to były nawet wycinki z jakiegoś programu kawałek tego żeby było w C i żebym mógł to zrozumieć fajnie by było ułatwiło by to mi trudne początki z programowaniem 😃

Pozdrawiam

Udostępnij ten post


Link to post
Share on other sites

Fajne czytałem to już wiele razy 😃 fajny artykuł tylko ja nie wiem jak to do końca napisać aby wszytko było ok np. jak czujnik 5 zobaczy linie to silnik L 20% mocy a silnik P 70% mocy nie jestem pewnie jak to napisać tak żeby to było poprawnie dlatego tak myślałem żeby ktoś na jakimś kodzie przykładowym mi to objaśnił 😃

Udostępnij ten post


Link to post
Share on other sites

Z tego co widzę Koledze bardziej zależy na kodzie w C a nie bascom, kóry pojawia sę w większości linków powyżej. Ja też mam podobną prośbę do Was o taki artykuł, też dopiero zaczynam programować w C. Mam na myśli taki artykuł, w którym pokazany byłby fragment kodu (w C), a po nim wytłumaczenie, za co odpowiada ten fragment programu. Myślę że to jest dobry temat na wakacyjny konkurs.

https://www.forbot.pl/forum/topics20/dla-poczatkujacych-podlaczanie-i-obsluga-urzadzen-zewnetrznych-w-robotyce-i-elektronice-vt6889.htm?utm_source=forbot&utm_medium=link_spis_art&utm_content=art_6889&utm_campaign=spis_art

Na samym początku w tym artykule jest o wyświetlaczu. Mam na myśli coś takiego, tylko że o programie do robotów FTL i oczywiście w języku C. Czy ktoś podjąłby się takiego zadania? Z góry dziękuję. Myślę że taki art na pewno nie tylko nam dwóm się przyda 🤣 .

Udostępnij ten post


Link to post
Share on other sites

Artykuł to nie będzie, ale myślę że w napisaniu najbardziej podstawowego algorytmu jazdy LFa może pomóc. Niedawno w ciągu wieczoru naklepałem takie coś do robocika kolegi.

Kolejność podłączenia czujników nie pokrywa się z ich fizyczną kolejnością, dlatego też wykorzystana została tablica ADC_adresses[7]. Są tam wpisane numery kanałów ADC odpowiadające kolejnym czujnikom.

Zasada działania jest banalna - w każdym przejściu pętli wykonywany jest odczyt ADC czujników, progowanie, liczenie błędu, dodanie/odjęcie wartości błędu do/od stałej wartości wypełnienia i na końcu wrzucenie tej ostatniej na PWM.

Błąd jest liczony jako średnia wartość wag czujników, na których wykryto czarną linię. W przypadku wykrycia linii na wszystkich 7 czujnikach robot staje w miejscu.

Zakomentowane w pętli głównej jest też wysyłanie danych z czujników przez UART.

Oprócz kodu programu przesyłam też 'strukturę Batona', takie spoko coś znalezione kiedyś w necie do pisania ładnych makr do obsługi GPIO działających w kodzie jako lValue.

Jak będzie mi się wybitnie nudziło, to może napiszę to jakoś bardziej składnie 😉

Tak btw, ja się czasem staram dla jaj napisać coś w takim stylu jak autor tematu, no ale nie potrafię. Ludzie, jak Wy to robicie? Da się jakoś bezpośrednio przelać myśl na ekran komputera, bez żadnych zbędnych interpunkcyjnych i gramatycznych bzdur? 😉

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <stdlib.h>
#include "io_cfg.h"
#include "uart.h"

void PWM(int lewy, int prawy);
void read_adc();
int licz_blad();

void init();
void uart_putd(uint16_t liczba);

int ADC_adresses[7] = {5,4,3,2,1,0,7};
int pomiary[7] = {0};
int czujniki[7] = {0};

int error = 0;

int main(void)
{
init();

LED = 1;
_delay_ms(200);
LED = 0;
_delay_ms(200);

   while(1)
   {
	read_adc();
	error = licz_blad();
	if(error == 666)
		PWM(0,0);
	else
		PWM(200+error, 200-error);

	/*uart_putc('#');
	uart_putd(czujniki[0]);
	uart_putd(czujniki[1]);
	uart_putd(czujniki[2]);
	uart_putd(czujniki[3]);
	uart_putd(czujniki[4]);
	uart_putd(czujniki[5]);
	uart_putd(czujniki[6]);
	uart_putc('*');
	uart_putd(error);*/

	_delay_ms(10);
   }
}

void PWM(int lewy, int prawy)
{
if(lewy >= 0)
{
	if(lewy>254)
		lewy = 254;
	EN_12 = 1;
	EN_11 = 0;
}
else
{
	if(lewy<-254)
		lewy = -254;
	EN_12 = 0;
	EN_11 = 1;	
}

if(prawy >= 0)
{
	if(prawy>254)
		prawy = 254;
	EN_22 = 1;
	EN_21 = 0;
}
else
{
	if(prawy<-254)
		prawy = -254;
	EN_22 = 0;
	EN_21 = 1;	
}

PWML = abs(lewy);
PWMP = abs(prawy);
}

// pomiar ADC na kolejnych wejściach podanych w tabeli ADC_adresses
// wyniki zapisane już w dobrej kolejności (tak jak fizycznie czujniki)
// w tabeli pomiary, a wartości 1/0 po progowaniu w tab. czujniki
void read_adc()
{
for(int i=0; i<7; i++)
{
	ADMUX = _BV(ADLAR) | _BV(REFS0);	// wyrównanie do lewej - będzemy czytać tylko starsze 8 bitów
	ADMUX |= ADC_adresses[i];			// wybranie odpowiedniego kanału ADC
	ADCSRA |= _BV(ADSC);				// start pomiaru
   	while(ADCSRA & _BV(ADSC)) {};		// czekamy aż skończy pomiar

   	pomiary[i] = ADCH;
	if(pomiary[i] > 150)				// progowanie; stały próg równy 150
		czujniki[i] = 1;
	else
		czujniki[i] = 0;
}
}

int licz_blad()
{
int err = 0;						// wartość błędu
int ilosc = 0;						// ilość czujników z wykrytą linią

for(int i=0; i<7; i++)
{
	err += czujniki[i]*(i-3)*50;	// wagi kolejnych czujników: -150, -100, -50, 0, 50, 100, 150
	ilosc += czujniki[i];
}

if(ilosc == 7)						// wszystkie czujniki wykryły linię - taki ficzer
	return 666;

err /= ilosc;						// liczymy średnią wagę

return err;
}

void init()
{
EN_11_DIR = OUTPUT;
EN_11 = 0;
EN_12_DIR = OUTPUT;
EN_12 = 0;
EN_21_DIR = OUTPUT;
EN_21 = 0;
EN_22_DIR = OUTPUT;
EN_22 = 0;
PWM1_DIR = OUTPUT;
PWM1 = 0;
PWM2_DIR = OUTPUT;
PWM2 = 0;
LED_DIR = OUTPUT;
LED = 0;

// KONFIGURACJA PWMa
TCCR1A = _BV(COM1A1) | _BV(COM1B1) | _BV(WGM10);
TCCR1B = _BV(CS10) | _BV(WGM12);

// KONFIGURACJA ADC
ADCSRA |= _BV(ADPS2) | _BV(ADPS1) | _BV(ADEN);
ADMUX |= _BV(ADLAR) | _BV(REFS0);

PWM(0,0);

uart_init(UART_BAUD_SELECT(19200, F_CPU));

sei();
}

void uart_putd(uint16_t liczba)
{
   char buffer[16];
   char* wynikA = 0;
   wynikA = itoa(liczba, buffer, 10);
   uart_puts(wynikA);
}
#ifndef IO_CFG_H
#define IO_CFG_H

// NIE RUSZ TEGO

#define INPUT 0
#define OUTPUT 1

typedef struct
{
 unsigned int bit0:1;
 unsigned int bit1:1;
 unsigned int bit2:1;
 unsigned int bit3:1;
 unsigned int bit4:1;
 unsigned int bit5:1;
 unsigned int bit6:1;
 unsigned int bit7:1;
} _io_reg; 

#define REGISTER_BIT(rg,bt) ((volatile _io_reg*)&rg)->bit##bt

// ODTĄD RUSZ ;)

#define EN_11				REGISTER_BIT(PORTD,5)
#define EN_11_DIR			REGISTER_BIT(DDRD,5)
#define EN_12				REGISTER_BIT(PORTB,7)
#define EN_12_DIR			REGISTER_BIT(DDRB,7)
#define EN_21				REGISTER_BIT(PORTD,6)
#define EN_21_DIR			REGISTER_BIT(DDRD,6)
#define EN_22				REGISTER_BIT(PORTD,7)
#define EN_22_DIR			REGISTER_BIT(DDRD,7)

#define PWM1				REGISTER_BIT(PORTB,1)
#define PWM1_DIR			REGISTER_BIT(DDRB,1)
#define PWM2				REGISTER_BIT(PORTB,2)
#define PWM2_DIR			REGISTER_BIT(DDRB,2)
#define PWMP				OCR1B
#define PWML				OCR1A

#define LED					REGISTER_BIT(PORTB,0)
#define LED_DIR				REGISTER_BIT(DDRB,0)

#endif //IO_CFG_H
  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Właśnie o coś takiego mi chodziło 🤣 . Wielkie dzięki. Za tydzień chyba skończę mojego LF, wtedy na pewno mi się to przyda.

Udostępnij ten post


Link to post
Share on other sites

Pochwal się wtedy koniecznie wynikami 😉

Udostępnij ten post


Link to post
Share on other sites
Artykuł to nie będzie, ale myślę że w napisaniu najbardziej podstawowego algorytmu jazdy LFa może pomóc. Niedawno w ciągu wieczoru naklepałem takie coś do robocika kolegi.

Może dokończę w końcu opis Rzazima, który wisi sobie w nieukończonych...

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

Zaloguj się, aby obserwować  

×
×
  • Utwórz nowe...