djm

Eurobricks Citizen
  • Content Count

    291
  • Joined

  • Last visited

Everything posted by djm

  1. djm

    [MOC] Minifig Mover

    Over on the Train forum a few months ago, @SavaTheAggie posted about his MOC called Quarter Scale Rail: Having worked out how the chain was made by watching the video, that post inspired me to come up with a MOC to allow moving Minifigs to be added to a MOC. The video below illustrates a sample of the Minifig Mover in action. Cutting straight to the case, building instructions are available on rebrickable.com. The primary design considerations were; for it to be compatible with the MILS system it was desirable for it to be possible to be run very slowly make it suitable for incorporation into MOCs Secondary design considerations were; to be able to achieve a 180 degree turn within the with of a single baseplate to aim to have small modules which could be joined to form a larger be assembly Comments/learnings/observations Each set of building instructions illustrates a baseplate within a building step. The baseplate is for reference purposes only and is not listed in the parts. The premise of including the baseplate is to show the relative placing of the parts with respect to a MILS baseplate. Experience suggests that the channel in which the chain runs needs to be perhaps 22 LDUs (LDraw units) wide. This width is reflected in the construction. If you try to build the channel 20 LDUs wide (i.e. the width of a 1 x N brick) you will likely find it too tight for the chain to run smoothly. The Minifig Mover is presented as a foundation on which to build. Thus, as can be seen in the video, the motor and tensioner assemblies are exposed. The suggestion is to build appropriate elements of a MOC to contain/hide these assemblies. Via the MOC posting on Rebrickable, you can download not only the building instructions but the original LDraw files too. The premise of doing this is to encourage others to use the design as a starting point and then publish improvements or alternative track modules. Regards, David
  2. djm

    [MOC] Minifig Mover

    Well someone could. The LDraw files are available via rebrickable.com. The premise of the MOC is to serve as a foundation for others builders to incorporate into their own MOC. David
  3. djm

    [MOC] Quarter Scale Rail

    I've completed producing building instructions for the Minifig Mover. It struck me that as a MOC, the Minifig Mover was more suited to being posted in the Town forum, so I created a post on that forum and referenced this original thread. Regards, David
  4. The Auckland LUG held its annual brick show in October, as part of Auckland Armageddon 2020. In recent years we have sold a member designed MOC to contribute to the costs of running the LUG. This year, a MOC I was chuffed when a MOC of mine was selected as the show model. There are still some boxed versions of this available, which can be ordered via this link. This is primarily intended for people in New Zealand but if you really want one shipped somewhere else, you would be welcome to inquire (but bear in mind the potential shipping cost). Building instructions and part inventory for model are available for downloaded from Rebrickable, so you are able to build it without having to purchase the model from AuckLUG. Regards, David
  5. Per the request by @Coder Shah in the Technic Forum for programs for some known LEGO Education NXT models. I did some trawling of LEGO website via the Wayback Machine and found the program files (which I've uploaded to bricksafe.com) for; Alpha Rex (referenced by Coder Shah as "9797 + 9695 Humanoid") Music Player ("9797 + 9695 Soundbot") Scorpion ("9797 + 96´╗┐95 Scorpio´╗┐n") Tribot ("9797 + 9695 Tribot") N.B. Use at your own risk. I have not tried uploading the programs to my NXT and cannot vouch for either their content or whether they actually work. Regards, David
  6. The first thing I would suggest is to download the updated ldraw.xml, which @SylvainLS does a wonderful job of updating and can be downloaded from the first post in this topic: If the updated ldraw.xml file doesn't contain what you are after, the same post describes the file structure. But try downloading the updated file first! David
  7. Bingo! From the LEGO education site elsewhere in the Wayback Machine. Classic Clock, Advanced Classic Clock, Simple Colour Sorter Grand Four Belt Rover Humanoid Intelligent Car Robot Arm Scorpion Sound Bot Advanced Tribot I think that these differ from the four I found earlier. Again, I can't vouch for their content but if you try them out it would be nice to know which ones work. It may keep you busy for a bit. Regards, David
  8. I dig some further digging via using the Wayback Machine. While there were links to the other 4 programs, sadly the zip files for them weren't available via the Wayback Machine. Hopefully someone else has a copy they can post. David
  9. I dug up programs for four of the above models (Humanoid, Scorpion, Tribot & Soundbot). Refer to this post in the Mindstorms forum
  10. djm

    [MOC] Quarter Scale Rail

    So I've taken the next step with the Minifig Mover and built a motorized proof of concept. I'm happy enough with the way this is shaping. The linear actuator enables the position of the third wheel to be adjusted to the most appropriate position. I've created some (hopefully) better designs for corners and straights. My intended next steps are; to "BrickLink" the parts for my designs wait some for the parts to arrive! build to the design. Where necessary, refine the design if all goes well, create building instructions for the designs post a "show and tell" on EuroBricks Given current shipping times to New Zealand, I suspect the earliest I'll be posting more will be late October or early November. Regards, David
  11. djm

    [MOC] Quarter Scale Rail

    As a proof of concept, I applied a tweak to the chain for @SavaTheAggie's Quarter Scale Rail: and knocked together (and hence without the build quality of the original video) a Minifig Mover: The premise being that it should be feasible to incorporate an arbitrary path built into a model to allow Minifigs (or anything else that can use a stud attachment) to be freed from being fixed in one place! Regards, David
  12. djm

    Automatically Reversing Gearbox

    Such as MOC - Improved GBC Reverser?
  13. Thank you @Cosmik42, that is generous of you. Regards, David
  14. I would suggest that 150 Euros for a second hand NXT set is far too expensive. I'm in New Zealand but take a look at an ebay site much closer to you (ebay.co.uk) and search for LEGO NXT sets to see what is on offer. Then use the advanced search in ebay to list "Sold Listings" to get a feel for what they normally sell for. For that kind of price you may be better to look at something like the much more recent LEGO Boost Creative Toolbox (set #17101). The programming environment for Boost is a lot easier for children to understand than than the NXT-G environment, which comes bundled with the NXT sets. My rule of thumb is that if I can buy just the NXT brick for NZ$ 50 (about EUR 25) or an NXT set for NZ$100 (about EUR 55), I might consider buying it. Others may have a different opinion. Regards, David
  15. Hi Peter, the premise of the spreadsheet is to leverage any part images cached by other applications so that it doesn't need to the BrickLink API. FYI although Brickficiency was a valid application at the time the spreadsheet was written, it isn't any longer as Brickficiency development ceased. Can you try creating a new list in BrickStock, add something simple to it e.g. a 2x4 Black Brick (part id is 3001). An image should be displayed in the BrickStock "Add Item to Untitled" dialog window, click the "Add" button and then the "Close" button. That should be sufficient to cause the image to be cached by Brickstock. Close BrickStock (you don't need to save the list), try clicking the "Populate Image Library" button and let me know the outcome. My expectation is that the Image Library should contain at least the image for the Black 2x2 Brick. Regards, David
  16. Hi Peter, over the last few years I have made a tweak or two to it but it remains fundamentally the same. I've uploaded the most recent version (from April 2019) to Google Drive. Can you confirm two things; 1) that the cell C7 in the Reference worksheet is reflecting your user profile directory and 2) that there is a sub-directory within that directory named brickstock-cache Regards, David
  17. Take a look at https://www.curvediscussion.com/new-zealand-lego-map/?pk_campaign=t, where a MOC builder has created a map of New Zealand based on GIS data. David
  18. djm

    Dacta Control Lab Software

    You could try reaching out to Ben Erwin (try https://www.linkedin.com/in/benjaminerwin). Perhaps he may have a copy of LEGO Engineer floating around? David
  19. djm

    Dacta Control Lab Software

    Seeing that I added those images to BrickLink, I must have the floppies lying around somewhere. I've got an old PC gathering dust in a corner with a 3.5" drive, so I should be able to get the content off the disks. Although I (must) have the 5.25" floppy, I don't have a drive to read it. However I've also got the version 1.0 for MS-DOS on 3.5" too so that should suffice. I will have a dig around in the next day or two and then drop you a PM. Regards, David
  20. Perhaps try Hub[0].State[99] instead of Hub.State[100]? Although the properties suggest an array indexed from 0 to 100, it also states 100 slots of integers, which could mean the index range is 0 to 99. David
  21. Jason Allemann, of JK Brickworks, has designed his first GBC. A very impressive model to behold: Refer to the JK Brickworks website for more information.
  22. Towards the end of October last year, I displayed my monorail at my LUGs annual "big" show. My monorail train uses an SBrick rather than the LEGO infra-red controller and I was also experimenting using @Cosmik42's Brick Automation Project to automate the running of the monorail. It had been a little while since I had run my monorail. The motor for mine was built fundamentally around the design by @Trekkie99. During the show, I experienced issues where the bricks which form the motor would separate every now and again and the train would stop moving. I managed to jury rig a solution on the fly and made a mental note to re-examine the design of the motor carriage to see if I could diagnose the cause and come up with a resolution. Having investigated and experimented a bit earlier this year, I came to the conclusion that the primary cause of the bricks separating is that the two gears being used to drive the wheel; the 12 tooth bevel: and the 8 tooth gear; although they will physically work when placed vertically between two Technic bricks, the fit is too tight. Over time, the bricks end up separating due to the tightness of the fit. This lead me to re-work the design for the motor. I came up with an approach which has a similar sized footprint using two of the 12 tooth bevel gears and appears to resolve the brick separation issue. The refined design looks like this: At the same time as reworking the gearing, I have come up with an alternative connection mechanism, inspired by the solid ball joint concept described here: The premise of using the solid ball joint is to allow the connection to not only turn in the horizontal plane for cornering but also in the vertical place for climbing or descending slopes. Caveat: while I have physically reworked my train to use this modified motor build and different connection, it is still a little experimental. The train does run but I haven't yet had the chance to run it for a sufficiently extended period of time to see how robust (or not!) it is. I am figuring by posting the design here, it will allow others to experiment with the solution. Further, if the solid ball joint mechanism doesn't prove to be adequate solution even if the motor bricks no longer separate, I believe the coupling mechanism is sufficiently modular to allow it to be easily replaced with an alternative design. The building instructions are available for the motor; as a PDF and as the corresponding LDraw file I've also reworked my monorail train design ... .. to not only use the modified design for the motor and connection, but also to lower the position of the SBrick within the carriage, to lower the monorail train's centre of gravity. The building instructions for the modified train are available; as a PDF as the corresponding LDraw file If anyone tries the modified design for the motor, irrespective of whether or not they also use the solid ball joint approach as a connection, I would appreciate it if you would post back to this thread to let others know whether or not the design is more robust than the original design. Regards, David
  23. I'll offer up a BAP code snippet here too, to try to help reduce the effort someone might require to create their own code. In my Globals, I have the following: // Enumeration to access individual operation configuration values. public enum config { initialised, cycle_timer_prefix, cycle_timer_suffix, inter_train_ms_delay, operate_using_timer, ramp_speed_from, ramp_speed_to, ramp_ms_duration, within_cycle, debug, eastbound_train, eastbound_train_active, westbound_train, westbound_train_active }; // ------------------------------------------------------------------------ // Routine name : configure // Description : Configure the operational parameters. // Arguments : hub_list_ao // List of hubs defined for the program. The State // property of the 0th list is used to hold configuration // data. This approach is used due to not seeming to be // be able to have objects defined within the globals // persist beyond the life of the routine instantiating // them. // ------------------------------------------------------------------------ public static void configure ( List<LegoTrainProject.Hub> hub_list_ao ) { // If initialisation has yet to occur ... if (hub_list_ao[0].State[(int)config.initialised] == 0) { // ... note that is is now initialised. hub_list_ao[0].State[(int)config.initialised] = 1; MainBoard.WriteLine("initialisation"); // Set the initial values. hub_list_ao[0].State[(int)config.cycle_timer_prefix] = 3000; hub_list_ao[0].State[(int)config.cycle_timer_suffix] = 60000; hub_list_ao[0].State[(int)config.inter_train_ms_delay] = 7000; hub_list_ao[0].State[(int)config.operate_using_timer] = 0; hub_list_ao[0].State[(int)config.ramp_speed_from] = 70; hub_list_ao[0].State[(int)config.ramp_speed_to] = 85; hub_list_ao[0].State[(int)config.ramp_ms_duration] = 2000; hub_list_ao[0].State[(int)config.within_cycle] = 0; hub_list_ao[0].State[(int)config.debug] = 0; hub_list_ao[0].State[(int)config.eastbound_train] = 2; hub_list_ao[0].State[(int)config.eastbound_train_active] = 0; hub_list_ao[0].State[(int)config.westbound_train] = 3; hub_list_ao[0].State[(int)config.westbound_train_active] = 0; } configuration config_lo = new configuration(); config_lo.show("Operation configuration", hub_list_ao); } // configure // ------------------------------------------------------------------------ public class configuration { private int _cycle_timer_prefix; private int _cycle_timer_suffix; private bool _debug; private bool _initialised; private int _inter_train_ms_delay; private bool _operate_using_timer; private int _ramp_speed_from; private int _ramp_speed_to; private int _ramp_ms_duration; private int _eastbound_train; private bool _eastbound_train_active; private int _westbound_train; private bool _westbound_train_active; private bool _within_cycle; // Provide definitions for each property managed within a PropertyGrid // control. public int cycle_timer_prefix { get { return _cycle_timer_prefix; } set { _cycle_timer_prefix = value; } } public int cycle_timer_suffix { get { return _cycle_timer_suffix; } set { _cycle_timer_suffix = value; } } public bool initialised { get { return _initialised; } set { _initialised = value; } } public int inter_train_ms_delay { get { return _inter_train_ms_delay; } set { _inter_train_ms_delay = value; } } public bool operate_using_timer { get { return _operate_using_timer; } set { _operate_using_timer = value; } } public int ramp_speed_from { get { return _ramp_speed_from; } set { _ramp_speed_from = value; } } public int ramp_speed_to { get { return _ramp_speed_to; } set { _ramp_speed_to = value; } } public int ramp_ms_duration { get { return _ramp_ms_duration; } set { _ramp_ms_duration = value; } } public bool debug { get { return _debug; } set { _debug = value; } } public bool within_cycle { get { return _within_cycle; } set { _within_cycle = value; } } public bool eastbound_train_active { get { return _eastbound_train_active; } set { _eastbound_train_active = value; } } public bool westbound_train_active { get { return _westbound_train_active; } set { _westbound_train_active = value; } } // ------------------------------------------------------------------------- public void show ( string window_title_as, List<LegoTrainProject.Hub> hub_list_ao ) { initialised = (hub_list_ao[0].State[(int)config.initialised] == 1); cycle_timer_prefix = hub_list_ao[0].State[(int)config.cycle_timer_prefix]; cycle_timer_suffix = hub_list_ao[0].State[(int)config.cycle_timer_suffix]; inter_train_ms_delay = hub_list_ao[0].State[(int)config. inter_train_ms_delay]; operate_using_timer = (hub_list_ao[0].State[(int)config. operate_using_timer] == 1); ramp_speed_from = hub_list_ao[0].State[(int)config.ramp_speed_from]; ramp_speed_to = hub_list_ao[0].State[(int)config.ramp_speed_to]; ramp_ms_duration = hub_list_ao[0].State[(int)config.ramp_ms_duration]; within_cycle = (hub_list_ao[0].State[(int)config.within_cycle] == 1); debug = (hub_list_ao[0].State[(int)config.debug] == 1); eastbound_train_active = (hub_list_ao[0].State[(int)config. eastbound_train_active] == 1); westbound_train_active = (hub_list_ao[0].State[(int)config. westbound_train_active] == 1); // Create a form, setting the form's title. Form prompt_lo = new Form(); prompt_lo.Width = 500; prompt_lo.Height = 400; prompt_lo.Text = window_title_as; // Create a propery grid in which to alter the public properties. PropertyGrid properties_lo = new PropertyGrid() { Size = new System.Drawing.Size(400, 220), Location = new Point(10, 80), CommandsVisibleIfAvailable = true, TabIndex = 1, Text = "Property Grid", HelpVisible = false, ToolbarVisible = false }; properties_lo.SelectedObject = this; prompt_lo.Controls.Add(properties_lo); ComboBox eastbound_lo = new ComboBox(); ComboBox westbound_lo = new ComboBox(); // Add labels for the comboboxes. for (int i_li = 0; (i_li < 2); i_li++) { Label label_lo = new Label(); label_lo.Text = "Hub for " + ((i_li == 0) ? "eastbound" : "westbound") + " train"; label_lo.Width = 110; label_lo.Left = 10; label_lo.Top = 12 + i_li * 30; prompt_lo.Controls.Add(label_lo); if (i_li == 0) { // Add a combo box for selecting the eastbound train hub. for (int j_li = 0; (j_li < hub_list_ao.Count); j_li++) { eastbound_lo.Items.Add(hub_list_ao[j_li].OfName.Substring(3)); } eastbound_lo.SelectedItem = (hub_list_ao[hub_list_ao[0].State[ (int)config.eastbound_train]]).OfName.Substring(3); eastbound_lo.DropDownStyle = ComboBoxStyle.DropDownList; eastbound_lo.Left = 120; eastbound_lo.Top = label_lo.Top - 2; prompt_lo.Controls.Add(eastbound_lo); } else { // Add a combo box for selecting the westbound train hub. for (int j_li = 0; (j_li < hub_list_ao.Count); j_li++) { westbound_lo.Items.Add(hub_list_ao[j_li].OfName.Substring(3)); } westbound_lo.SelectedItem = (hub_list_ao[hub_list_ao[0].State[ (int)config.westbound_train]]).OfName.Substring(3); eastbound_lo.DropDownStyle = ComboBoxStyle.DropDownList; westbound_lo.Left = 120; westbound_lo.Top = label_lo.Top - 2; prompt_lo.Controls.Add(westbound_lo); } } // Display the form. prompt_lo.ShowDialog(); // Note the values entered within the property grid. hub_list_ao[0].State[(int)config.initialised] = initialised ? 1 : 0; hub_list_ao[0].State[(int)config.cycle_timer_prefix] = cycle_timer_prefix; hub_list_ao[0].State[(int)config.cycle_timer_suffix] = cycle_timer_suffix; hub_list_ao[0].State[(int)config.inter_train_ms_delay] = inter_train_ms_delay; hub_list_ao[0].State[(int)config.operate_using_timer] = operate_using_timer ? 1 : 0; hub_list_ao[0].State[(int)config.ramp_speed_from] = ramp_speed_from; hub_list_ao[0].State[(int)config.ramp_speed_to] = ramp_speed_to; hub_list_ao[0].State[(int)config.ramp_ms_duration] = ramp_ms_duration; hub_list_ao[0].State[(int)config.within_cycle] = within_cycle ? 1 : 0; hub_list_ao[0].State[(int)config.debug] = debug ? 1 : 0; hub_list_ao[0].State[(int)config.eastbound_train_active] = eastbound_train_active ? 1 : 0; hub_list_ao[0].State[(int)config.westbound_train_active] = westbound_train_active ? 1 : 0; // Use the combobox values to identify the eastbound and westbound // trains. hub_list_ao[0].State[(int)config.eastbound_train] = (int)eastbound_lo. SelectedIndex; hub_list_ao[0].State[(int)config.eastbound_train] = (int)eastbound_lo. SelectedIndex; } // show } // configuration Using PropertyGrid allows me to try out different configuration values on the fly. I add a sequence with my which simply contains: // Operate the configuration window. configure(Hub); which will open a window, allow me to tutu with the values and see the impact. Caveat: I've programmed in many languages but until now, not C#, so the code may be ugly. Regards, David
  24. Hi @Cosmik42, I'm using BAP to control a monorail for a public display and I've encountered an issue. My configuration is as follows; Hub one is an EV3 with NXT touch sensors connected Hub two is an EV3 with NXT touch sensors connected Hub three is an SBrick which powers train 1 Hub four is an SBrick which powers train 2 BAP will connect to all of the hubs successfully. However, when I have both of the EV3 hubs (i.e. one and two) connected, the moment one of the touch sensors is triggered, BAP exits straight away. If I plug all the NXT touch sensors into a single EV3 hub and only connect one hub, the touch sensor triggering works as desired and the events and related code executes flawlessly. I suspect some kind of bug exists in the situation of there being multiple EV3 hubs connected but I do not have any means of tracing what is happening. I believe that you only have one EV3, so getting you to diagnose the root cause of this issue could be a challenge. Is there any way to set some form of "debug" flag at run time in order to get a trace of the code as it executes? If that is not possible, do you have any suggestions as to how I can further trace the cause of the issue? Regards, David
  25. Your mileage may vary. On my Windows 10 machine, I fired up Bricx to see if I could connect to an NXT via Bluetooth. My NXT is named djm01. Using the menu item "Tools/Find Brick" menu item, opened up a dialog window. Within that window, I expanded the "Port" drop-down list. In that list there were two entries with respect to my NXT; one labelled BTH:DJM01 one labelled BTH:DJM01:<then a hex code> I successfully connected to the NXT with Bricx using the entry with the hex code. Although the actual hex code value isn't especially important, it corresponds to the value in the "Association Endpoint address" (visible using Device Manager and looking within the "Details" tab of the properties for the device). So my suggestion would be to take a second look at the list of ports and see if there is another entry which includes a hex code and try that one. Regards, David