Skocz do zawartości

Dziobak94

Użytkownicy
  • Zawartość

    12
  • Rejestracja

  • Ostatnio

Informacje

  • Płeć
    Mężczyzna
  • Lokalizacja
    Rbk/Wro
  • Zawód
    elektryk
  • Moje zainteresowania:
    elektronika, CNC

Ostatnio na profilu byli

Blok z ostatnio odwiedzającymi jest wyłączony i nie jest wyświetlany innym użytkownikom.

Osiągnięcia użytkownika Dziobak94

Odkrywca

Odkrywca (4/19)

  • Za 5 postów
  • Młodszy Juror
  • To już rok!
  • To już 5 lat!

Odznaki

1

Reputacja

  1. Mam kilka uwag co do artykułu: Po 1: Kostki nie były grafenowe -> Commercial Plastic (nawet tak na filmie mówią) Tylko inspirowali się strukturą Po 2: Miałem do czynienia z wytrzymałością materiału, materiałoznawstwem itd dużo do czynienia. Przy okazji sam obsługuję prasy hydrauliczne, film dowodzi jednej i dobrze znanej zasady, lokalne niedoskonałości na cienkościennych materiałach powodują pękanie, czyli model cienko ścienny właśnie będzie zachowywał się jak na filmie. Do tego struktura którą MIT wymyśliło jakby wymusza "zmianę" kierunku działania siły w materiale. Zachowanie kostki o grubszych "profilach" też było dość intuicyjne. Widać tu że mamy do czynienia z większym wypełnieniem objętości, czyli materiał sam w sobie powinien lepiej reagować na siły ściskające. Na dodatek, karb który spowodował pęknięcie a następnie "eksplozję", niejako wywołał reakcję łańcuchową (tak jak rozpadające się koło zamachowe jeżeli dojdzie do pęknięcia). Nihil Novi PS pękanie tego cienkiego "trwało" tak długo ze względu na zasadę działania prasy hydraulicznej... Zanim okładki prasy ponownie dotknęły badany obiekt trwało to dużo więcej niż samo naprężenie materiału i jego pękanie. A i żeby było jasne, dlatego np stosuje się konstrukcje w postaci ramy (zwiększenie odległości pracy, szczególnie na momenty gnące, przy tej samej ilości materiału) lub też odpowiednich profili (szczególnie w automotiv) bo jest to związane z prawami fizyki. Jedyne powiązanie tego artykułu z Grafenem jest fakt że przyglądali się strukturze Grafenu i zbudowali model oparty o obliczenia.
  2. Ogólnie to na zdjęciu widać o czym jest mowa, siłownik (klasyczny z tego co widzę to nawet jednostronnego działania) a w zasadzie to dwa poruszają listwą zębatą wykonaną z czerwonawego czegoś (zakładam że nylon albo inne tworzywo sztuczne jeżeli mowa o małym tarciu). Zębatki te poruszają za to kołem zębatym a ten wałem do ruchu ręką. w zasadzie to nic innowacyjnego. Co śmieszne tak na prawdę to nie żaden robot, bo on dokładnie odwzorowuje ruchy człowieka. Zbudowali oni układ hydrauliczny ala hamulec samochodowy, jak ty naciskasz na pedał to wysuwa się klocek. Ogólnie zamysł jest fenomenalny i bardzo prosty, problem pojawia się gdy taką hydraulikę trzeba napędzać komputerowo, tzn i tak potrzebna jest pompa a tu w zasadzie siłownik który będzie napędzał te na maszynie, można powiedzieć że wykorzystali bardzo dobrze znany rodzaj przenoszenia napędu (w przemyśle ciężkim typu koparki itd) do mniejszej skali. Ogólna przekładnia tego mechanizmu jest 1:1 a związane jest to z objętościami siłowników które na "robocie" jak i manipulatorze muszą być takie same.
  3. Dzięki wielkie ! Problemy zaczynają się klarować. Mam tylko jedno pytanie, czy ktoś próbował wykorzystać funkcję HAL_CAN_Tranmit_IT i HAL_CAN_Receive_IT ? Mi udaje się tylko przy Transmit_IT i zwykłym Receive. Do tego nie potrafię odpalić ponownie transmisji. Dane wysyłają się tylko raz. (Oczywiście udanie raz, jak nie dostaną odpowiedzi że zostały wysłuchane wiadomość się zapętla aż ktoś potwierdzi otrzymanie komunikatu). EDIT 2:11 : Dodam jeszcze że za pomocą tzw Pollingu wszystko gładko poszło 😉 wygląda na to że nie potrafię porządnie obsłużyć przerwań. za pomocą CallBack'ów. 😳 [ Dodano: 10-05-2016, 00:09 ] Dziękuję wszystkim pięknie za pomoc ! Udało mi się odpalić Całość za pomocą przerwań 🙂 Temat do zamknięcia.
  4. Dzięki za rady, Ogólnie to korzystałem i z jednego i z drugiego. Wygląda jednak na to że kontroler nasłuchuje sieć tak że potrzebny jest Transcriver. Po inicjalizacji wysyłane jest kilka bitów (tak jakby sprawdzanie sieci, albo odpytywanie Transcrivera) po czym wyskakuje błąd kontrolera (Stan najpierw TIMEOUT potem ERROR). Jakieś rady ? W poniedziałek skoczę po Transcrivery na THT albo cały moduł.
  5. AD1 : Transceiver CAN służy do tego jak mówiłeś zmiany sygnału, do odpowiedniej warstwy fizycznej. Jednak oba uC komunikują się po tej samej warstwie, fakt jest taki że bez nich nie da się podłączyć większej ilości urządzeń. ale Transceiver zmienia warstwę A na B, z drugiej strony dzieje się na odwrót z B na A. AD2 : Niestety nie mam nigdzie na stanie Oscyloskopu, ale będę musiał gdzieś się przejść żeby dostać dostęp 🙂 Ma ktoś jakieś inny pomysł ?
  6. Cześć, Od dwóch dni staram się uporać z komunikacją dwóch mikro-kontrolerów ze sobą przez magistralę CAN. Wykorzystuję do tego płytki Nucleo F303RE, na razie bez transcrivera, jednak połączone są ze sobą RX->TX i TX->RX (tylko 2 płytki więc nie powinno być problemu). Tu poniżej kod dla 1 i 2 płytki (różnią się tylko wnętrzem pętli While, raz za komentowana jedna część raz druga) Jeśli można prosić o jakąś wskazówkę co robię nie tak. Kod jak widać tworzony przez CubeMX /** ****************************************************************************** * File Name : main.c * Description : Main program body ****************************************************************************** * * COPYRIGHT(c) 2016 STMicroelectronics * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. Neither the name of STMicroelectronics nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************** */ /* Includes ------------------------------------------------------------------*/ #include "stm32f3xx_hal.h" /* USER CODE BEGIN Includes */ /* USER CODE END Includes */ /* Private variables ---------------------------------------------------------*/ CAN_HandleTypeDef hcan; /* USER CODE BEGIN PV */ /* Private variables ---------------------------------------------------------*/ CanRxMsgTypeDef Rxcan; CanTxMsgTypeDef Txcan; /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_CAN_Init(void); static void dane0(void); static void dane1(void); static void odbior(void); /* USER CODE BEGIN PFP */ /* Private function prototypes -----------------------------------------------*/ /* USER CODE END PFP */ /* USER CODE BEGIN 0 */ int abc; /* USER CODE END 0 */ int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration----------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* Configure the system clock */ SystemClock_Config(); /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_CAN_Init(); /* USER CODE BEGIN 2 */ __CAN_CLK_ENABLE (); __GPIOD_CLK_ENABLE (); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ odbior(); abc=CAN_RDL0R_DATA0; if(abc==0b11011111) { HAL_GPIO_TogglePin(ULN25_GPIO_Port,ULN25_Pin); } /* dane0(); HAL_GPIO_TogglePin(ULN25_GPIO_Port,ULN25_Pin); HAL_Delay(200); dane1(); HAL_GPIO_TogglePin(ULN25_GPIO_Port,ULN25_Pin); HAL_Delay(500); */ } /* USER CODE END 3 */ } /** System Clock Configuration */ void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct; RCC_ClkInitTypeDef RCC_ClkInitStruct; RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.HSICalibrationValue = 16; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; HAL_RCC_OscConfig(&RCC_OscInitStruct); RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0); HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000); HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); /* SysTick_IRQn interrupt configuration */ HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); } /* CAN init function */ void MX_CAN_Init(void) { hcan.Instance = CAN; hcan.Init.Prescaler = 16; hcan.Init.Mode = CAN_MODE_NORMAL; hcan.Init.SJW = CAN_SJW_1TQ; hcan.Init.BS1 = CAN_BS1_1TQ; hcan.Init.BS2 = CAN_BS2_1TQ; hcan.Init.TTCM = DISABLE; hcan.Init.ABOM = DISABLE; hcan.Init.AWUM = DISABLE; hcan.Init.NART = DISABLE; hcan.Init.RFLM = DISABLE; hcan.Init.TXFP = DISABLE; HAL_CAN_Init(&hcan); } /** Configure pins as * Analog * Input * Output * EVENT_OUT * EXTI */ void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; /* GPIO Ports Clock Enable */ __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_GPIOC_CLK_ENABLE(); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOA, S_STOP_Pin|ULN25_Pin|ULN24_Pin|ULN23_Pin |ULN17_Pin|ULN18_Pin|S_POZ_Pin, GPIO_PIN_RESET); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOB, ULN16_Pin|S_ML_Pin|ULN15_Pin|S_MP_Pin |ULN22_Pin|ULN27_Pin|ULN26_Pin, GPIO_PIN_RESET); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOC, ULN21_Pin|ULN28_Pin|P_SYR_Pin|P_KOG_Pin, GPIO_PIN_RESET); /*Configure GPIO pins : S_STOP_Pin ULN25_Pin ULN24_Pin ULN23_Pin ULN17_Pin ULN18_Pin S_POZ_Pin */ GPIO_InitStruct.Pin = S_STOP_Pin|ULN25_Pin|ULN24_Pin|ULN23_Pin |ULN17_Pin|ULN18_Pin|S_POZ_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /*Configure GPIO pins : ULN16_Pin S_ML_Pin ULN15_Pin S_MP_Pin ULN22_Pin ULN27_Pin ULN26_Pin */ GPIO_InitStruct.Pin = ULN16_Pin|S_ML_Pin|ULN15_Pin|S_MP_Pin |ULN22_Pin|ULN27_Pin|ULN26_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); /*Configure GPIO pins : ULN21_Pin ULN28_Pin P_SYR_Pin P_KOG_Pin */ GPIO_InitStruct.Pin = ULN21_Pin|ULN28_Pin|P_SYR_Pin|P_KOG_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); } /* USER CODE BEGIN 4 */ void odbior(void) { Rxcan.IDE = CAN_ID_STD; Rxcan.StdId = 100; Rxcan.RTR = CAN_RTR_DATA; Rxcan.DLC = 8; Rxcan.FIFONumber = CAN_FIFO0; hcan.pRxMsg = &Rxcan; HAL_CAN_Receive(&hcan,0,1000); } void dane1(void) { Txcan.IDE = CAN_ID_STD; Txcan.StdId = 100; Txcan.RTR = CAN_RTR_DATA; Txcan.DLC = 8; Txcan.Data [0] = 0b11011111; hcan.pTxMsg = &Txcan; HAL_CAN_Transmit(&hcan,100); } void dane0(void) { Txcan.IDE = CAN_ID_STD; Txcan.StdId = 100; Txcan.RTR = CAN_RTR_DATA; Txcan.DLC = 8; Txcan.Data [0] = 0b00000000; hcan.pTxMsg = &Txcan; HAL_CAN_Transmit(&hcan,100); } /* USER CODE END 4 */ #ifdef USE_FULL_ASSERT /** * @brief Reports the name of the source file and the source line number * where the assert_param error has occurred. * @param file: pointer to the source file name * @param line: assert_param error line source number * @retval None */ void assert_failed(uint8_t* file, uint32_t line) { /* USER CODE BEGIN 6 */ /* User can add his own implementation to report the file name and line number, ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ /* USER CODE END 6 */ } #endif /** * @} */ /** * @} */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ Z góry dzięki za każdą pomoc, Pozdrawiam, Tomasz
  7. Tak jak w zadaniu wrzucam w komentarz screeny: Gdy licznik ładnie stoi na 0 oraz po puszczeniu na chwilę programu Podoba mi się że zaczynacie kurs od debugera, dużo osób jednak omija tą kwestie i jest wtedy znaczny problem dla młodych. Tak jak pisałem będę zmieniał kod pod Nucleo F401RE i każdą zamianę którą napotkam podeślę do twórcy lub wrzucę w komentarz.
  8. Tutaj chodzi o rodzaj jak masz zrobiony manipulator. patrząc że masz 3 wiązania i 1 to ta od ziemi do pierwszego członu, 2 to pomiędzy pierwszym a drugim członem a 3 pomiędzy drugim a "chwytakiem" (punktem którym ma się za zadanie poruszać w określony sposób). i teraz masz Theta - obrotowy i Lambda - przesuwną. a dokładnie jest to przesunięcie o kąt bądź odległość od punktu startowego. każda para na początku się rozgałęzia (bo np. jeśli wiązanie nr1 jest obrotowe to czy zmienisz kąt o 15 czy o -15 stopni to dalej możesz uzyskać ten sam punkt). drugie wiązanie również się rozchodzi (z tego same względu) a ostatnie już nie bo one jest ustalone jednoznacznie (jeśli dwa poprzednie masz ustawione tak a nie inaczej to 3 musi być ustawiony w zadany sposób żeby trafić w punkt) Mam nadzieję że napisałem w miarę jasno 🙂 PS liczba konfiguracji zależy od ilości wiązań (a tak na prawdę od wymiarów swobody ruchu) oraz od konfiguracji manipulatora przy twoim założeniu że masz 2 obrotowe ® i jeden posuwisty (translacyjny- T) możesz mieć kilka rodzajów manipulatorów: RRT , RTR , TRR
  9. Świetny kurs dla początkujących. Ja osobiście dodałbym pracę na przerwaniach i wbudowanych licznikach żeby niepotrzebnie nie blokować pracy uC np jeśli ktoś będzie chciał zamrugać 4 razy diodą po 1 sec. Mikro-kontroler stałby w funkcji Delay 7 sekund a to już długo. W najprostszych rozwiązaniach może i się to sprawdzi ale później to już inna bajka 🙂 Mimo wszystko gratuluję dobrej i skrupulatnej części + to że napisane tak że każdy zrozumie.
  10. KosmicznyGruz, ja mam kilka pytań. 1. Na czym postawiłeś RPi ? Jaki jest jego system ? 2. Szacowany koszt inwestycji ? 3. z tego co widać wykorzystałeś gotową "ramę", jakie prędkości taki robocik rozwija ? Z góry dzięki za informacje i przepraszam za małe odkopanie tematu Pozdrawiam Tomasz
  11. Maniek93, sam mam płytkę F401RE będę przerabiał ten kurs na potrzeby M4 w własnym zakresie, jeśli uda mi się dojrzeć różnice będę informował o tym na forum niezwłocznie. Kupiłem tego STM'a żeby zamienić PLC'ka do sterowania Pneumatyką na coś bardziej "inteligentnego" i dużo mniejszego (ilość modułów które mam zamiar nim zastąpić, nie mieściłaby się w raz z sterownikiem na 50cm), przy okazji będę mógł w prostszy sposób stworzyć dobre PID na nim. Jak czas pokaże, to może wrzucę to tutaj na forum, ale na razie to długa droga jeszcze przed zakończeniem projektu. 😃
  12. Kilka Tips&Tricks dla posiadaczy proxxona fbs 240e i innych tego typu sprzętów. 1. Podczas cięcia różnego rodzaju materiałów, w tym np płyt z okleiną czy innych materiałów które łatwo u szczerbić, dobrym pomysłem jest naklejenie taśmy "szkota". Otrzymamy w ten sposób gładki rant. 2. Ta porada w sumie chyba najprostsza a zarazem najcenniejsza. Jeśli tniecie śruby, pręty gwintowane lub cokolwiek co ma gwint (np. trzeba dopasować śrubę bo za długa). Wpierw nakręćcie nakrętkę na gwint, po przecięciu nakrętka ta nagwintuje na nowo popsutą (uszkodzoną) część śruby. W ten oto sposób możemy uniknąć posiadania gwintownika do prostych czynności. Sposoby te są proste i znane starym wyjadaczom. Zakładam jednak że komuś się przydadzą. Pozdrawiam, Tomasz
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.